Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.02.2013, 11:07   #1
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию Бесконечный ответ от сервера (IdHTTP.Post)

Поступил заказ на софт. Софт работает с сайтом http://chatvdvoem.ru (онлайн чат).
Задача войти в чат, дождаться собеседника и отправить сообщение, после чего закончить разговор.
В принципе ни чего сложного, проснифел браузер, все по фен-шую.
Навалял такую функцию (делает действия описанные выше).
Код:
function Make_Post(text:string):string;
var IdHTTP:TidHTTP;
    IdCookieManager:TIdCookieManager;
    IdCompressorZLib:TIdCompressorZLib;
    data:TStringList;
    html,uid,cid:string;
    next:bool;
begin
    IdHTTP:=TidHTTP.Create;
    IdCookieManager:=TIdCookieManager.Create;

    IdHTTP.CookieManager:=IdCookieManager;
    IdHTTP.HandleRedirects:=true;
    IdHTTP.AllowCookies:=true;
    IdHTTP.Compressor:=IdCompressorZLib;
    data:=TStringList.Create;

    IdHTTP.Request.UserAgent:='Mozilla/5.0 (Windows NT 6.2; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0';
    IdHTTP.Request.Referer:='http://chatvdvoem.ru/';
    IdHTTP.Request.AcceptEncoding:='gzip, deflate';
    IdHTTP.Request.AcceptLanguage:='ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3';
    IdHTTP.Request.Accept:='application/json, text/javascript, */*';
    IdHTTP.Request.ContentType:='application/x-www-form-urlencoded; charset=UTF-8';
    IdHTTP.Request.CustomHeaders.Text:='X-Requested-With: XMLHttpRequest';
    IdHTTP.Request.Connection:='keep-alive';
    IdHTTP.Request.Pragma:='no-cache';
    IdHTTP.Request.CacheControl:='no-cache';
    IdHTTP.ProtocolVersion:=pv1_1;

    data.Add('action=get_uid');
    html:=IdHTTP.Post('http://chatvdvoem.ru/send',data);
    Application.ProcessMessages;
    uid:=IsolateText_Mini(html,'"uid":"','"');

    data.Clear;
    data.Add('action=get');
    html:=IdHTTP.Post('http://chatvdvoem.ru/events?'+uid,data);
    Application.ProcessMessages;
    cid:=IsolateText_Mini(html,'"cid":"','"');


    data.Clear;
    data.Add('action=wait_opponent');
    data.Add('uid='+uid);
    IdHTTP.Post('http://chatvdvoem.ru/send',data);
    Application.ProcessMessages;




    data.Clear;
    data.Add('action=set_ready');
    data.Add('uid='+uid);
    data.Add('cid='+cid);
    html:=IdHTTP.Post('http://chatvdvoem.ru/send',data);
    Application.ProcessMessages;

    html:='';

    while pos('start_typing',html) = 0 do
     begin
        data.Clear;
        data.Add('action=get');
        html:=IdHTTP.Post('http://chatvdvoem.ru/events?'+uid,data);
        Application.ProcessMessages;
     end;

    data.Clear;
    data.Add('action=send_message');
    data.Add('uid='+uid);
    data.Add('cid='+cid);
    data.Add('message='+text);
    IdHTTP.Post('http://chatvdvoem.ru/send',data);
    Application.ProcessMessages;

    data.Clear;
    data.Add('action=stop_chat');
    data.Add('uid='+uid);
    data.Add('cid='+cid);
    data.Add('opponent_init=0');
    IdHTTP.Post('http://chatvdvoem.ru/send',data);
    Application.ProcessMessages;


    IdHTTP.Free;
    IdCookieManager.Free;
    data.Free;
end;
При тестирование получил жесткий облом.
Первый запрос уходит на ура
Код:
    data.Add('action=get_uid');
    html:=IdHTTP.Post('http://chatvdvoem.ru/send',data);
    Application.ProcessMessages;
    uid:=IsolateText_Mini(html,'"uid":"','"');
А второй зависает в воздухе, т.е сервер не отвечает на него, а софт (IdHTTP) ждет ответа, провисел так где-то 10 мин.
Код:
    data.Clear;
    data.Add('action=get');
    html:=IdHTTP.Post('http://chatvdvoem.ru/events?'+uid,data);
    Application.ProcessMessages;
    cid:=IsolateText_Mini(html,'"cid":"','"');
Но в браузере все ок. И последовательность та же, и Heder тот же.
Грешу на IdHTTP.ProtocolVersion:=pv1_1;, т.к один фиг запрос идет HTTP/1.0. Хотя не факт.
Прошу поделиться советом в какую сторону копать.
bakanaev вне форума Ответить с цитированием
Старый 02.02.2013, 22:28   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
html:=IdHTTP.Post
Раз уж ты все равно получаешь данные в строку то может стоит использовать Get вместо Post?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.02.2013, 07:23   #3
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Get вместо Post?
Не смешно если честно) Как в php есть разница каким запросам приходят данные.

Или вы что-то другое сказать хотели?)
bakanaev вне форума Ответить с цитированием
Старый 05.02.2015, 10:28   #4
Milkynder
 
Регистрация: 05.02.2015
Сообщений: 5
По умолчанию

автор, сообщите пожалуйста удалось ли вам выяснить причину такого состояния запроса, и как вы ее решили? Столкнулся с такой же проблемой
Milkynder вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ответ от сервера IdHTTP WhiteForge Работа с сетью в Delphi 13 30.07.2013 12:26
Ускорить idhttp или как в некоторых случаях не получать ответ от сервера? Кольша Работа с сетью в Delphi 4 24.01.2012 21:50
Ответ от сервера ursa1992 Работа с сетью в Delphi 33 10.01.2012 04:00
Idhttp ответ на post запрос andrejjka Работа с сетью в Delphi 1 30.01.2011 13:41
Обработать ответ от сервера [POST] sice Общие вопросы Delphi 3 26.01.2011 15:02