TIdHTTP - session has expired message under Delphi XE

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

Сообщение в формате HTML гласит, что моя сессия истекла. Однако тот же самый код без проблем работает в Delphi 2007 и по сей день. Я поискал информацию в интернете и выяснил, что нужно использовать CookieManager.

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

Что еще можно попробовать?

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

Я скачал snapshot 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
      + '®ulamin=tak&simg=' + AImageSeed + '&x=39&y=13';
    AIdHTTP.Get(S, WebContent);
    if Pos('
', WebContent.DataString) > 0 then ShowMessage('It works properly.') else if Pos('
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.

Спасибо.

11
задан Marko 25 September 2012 в 21:45
поделиться