TIdHTTP - сеанс истек сообщение под Delphi XE - PullRequest
11 голосов
/ 03 января 2012

Я пытаюсь перенести мой код с Delphi 2007 на Delphi XE (пока нет обновления 1).Проблема, на которую я наткнулся, заключается в том, что в Delphi XE я получаю другой ответ от сервера после отправки второго сообщения GET.

В сообщении в формате HTML указано, что мой сеанс истек.Тем не менее, тот же код работает без каких-либо проблем под Delphi 2007 до сегодняшнего дня.Я искал информацию через Интернет и обнаружил, что мне следует использовать CookieManager?

Дело в том, что я не использую ни одного в Delphi 2007, и когда я назначил один в Delphi XE, результат моего кода не имеетизменилось.Тем не менее я получаю сообщение об истекшем сеансе.

Что еще я могу попробовать?

Обновление: Я нашел некоторую информацию о том, что у Indy 10 есть проблемы с файлами cookie, но они былиисправлено.

Я скачал снимок Indy10_4722, к сожалению, ошибка все еще возникает.

Обновление 2 - предоставлен код

Итак, я подготовилпример кода.Это совместимо с обоими Delphi (2007 и XE).Однако, чтобы скомпилировать его в версии 2007, вам необходимо иметь библиотеку GraphicEx .

. Код подключается к реальному серверу, загружает изображение безопасности и отображает его в форме.Перепишите буквы с изображения в поле редактирования и закройте форму.Это все, что вам нужно сделать, чтобы протестировать его.

program IndyTest;

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Contnrs, Menus, ExtCtrls, IdBaseComponent,
  IdComponent, IdTCPConnection, IdTCPClient, IdHTTP,
  {$IFDEF VER220}PngImage{$ELSE}GraphicEx{$ENDIF}, StrUtils;

{$R *.res}

procedure LoadSecurityImage(AImage: TImage; AIdHTTP: TIdHTTP; AImgLink: String);
var
  PNGGraphic: {$IFDEF VER220}TPngImage{$ELSE} TPNGGraphic{$ENDIF};
  ResponseStream: TMemoryStream;
begin
  ResponseStream := TMemoryStream.Create;
  PNGGraphic   := {$IFDEF VER220}TPngImage.Create{$ELSE}TPNGGraphic.Create{$ENDIF};
  try
    AIdHTTP.Get(AImgLink, ResponseStream);
    ResponseStream.Position := 0;
    PNGGraphic.LoadFromStream(ResponseStream);
    AImage.Picture.Assign(PNGGraphic);
  finally
    ResponseStream.Free;
    PNGGraphic.Free;
  end;
end;

function GetImageLink(AIdHTTP: TIdHTTP): String;
var
  WebContentStream: TStringStream;
  Index, Index2: Integer;
begin
  Result := '';
  WebContentStream := TStringStream.Create('');
  try
    AIdHTTP.Request.ContentType := 'application/x-www-form-urlencoded';
    AIdHTTP.Get('http://czat.wp.pl/i,1,chat.html', WebContentStream);
    Index := Pos('id="secImg">', WebContentStream.DataString);
    if Index > 0 then
    begin
      Index := PosEx('src="', WebContentStream.DataString, Index) + 5;
      Index2 := PosEx('">', WebContentStream.DataString, Index);
      if Index > 10 then
      begin
        Result := Copy(WebContentStream.DataString, Index, Index2 - Index);
      end;
    end;
  finally
    WebContentStream.Free;
  end;
end;

procedure CheckForContent(const ANick, AImageSeed: String; AIdHTTP: TIdHTTP);
var
  WebContent: TStringStream;
  S: String;
begin
  WebContent := TStringStream.Create('');
  try
    AIdHTTP.Request.ContentType := 'application/x-www-form-urlencoded';
    S := 'http://czat.wp.pl/chat.html?i=31179&auth=nie&nick=' + ANick
      + '&regulamin=tak&simg=' + AImageSeed + '&x=39&y=13';
    AIdHTTP.Get(S, WebContent);
    if Pos('<div class="applet">', WebContent.DataString) > 0 then
      ShowMessage('It works properly.')
    else if Pos('<div id="alert">Sesja wygas', WebContent.DataString) > 0 then
      ShowMessage('Session expired')
    else
      ShowMessage('Unknown result.');
  finally
    WebContent.Free;
  end;
end;

var
  LogForm: TForm;
  SecurityImage: TImage;
  Edit: TEdit;
  IdHTTPWp: TIdHTTP;
begin
  Application.Initialize;
  IdHTTPWp := TIdHTTP.Create(Application);
  IdHTTPWp.AllowCookies := True;
  IdHTTPWp.HandleRedirects := True;
  IdHTTPWp.HTTPOptions := [hoForceEncodeParams];

  LogForm := TForm.Create(Application);
  LogForm.Position := poScreenCenter;
  SecurityImage := TImage.Create(LogForm);
  SecurityImage.Parent := LogForm;
  SecurityImage.AutoSize := True;
  Edit := TEdit.Create(LogForm);
  Edit.Parent := LogForm;
  Edit.Top := 64;
  LoadSecurityImage(SecurityImage, IdHTTPWp, GetImageLink(IdHTTPWp));
  LogForm.ShowModal;
  CheckForContent('TestUser', Edit.Text, IdHTTPWp);
  Application.Run;
end.

Обновление 3

Пакеты данных для примера Delphi 2007 здесь .

Пакеты данных для примера Delphi XE здесь .

Бесплатная программа для анализа пакетов SmartSniff .

Спасибо.

1 Ответ

1 голос
/ 24 октября 2012

Я думаю, вам следует рассмотреть запрос, используя такие инструменты, как httpanalyzer или fiddler .

Сначала используйте Internet Explorer и посмотрите, как он выполняет запрос.

Тогда используйте ваше приложение и сравните оба запроса. Если это проблема с cookie, вы увидите, что не так.

Поддерживать жизнь - это не ваш ответ. Это только делает ваше соединение не прерываться при каждом запросе к одному и тому же серверу. См Википедия

...