Sto provando a trasferire il mio codice da Delphi 2007 a Delphi XE (non ancora l'aggiornamento 1). Il problema su cui mi sono imbattuto è che con Delphi XE ho ricevuto una risposta diversa dal server dopo l'invio del secondo messaggio GET.TIdHTTP - la sessione è scaduta messaggio in Delphi XE
Il messaggio in formato HTML indica che la mia sessione è scaduta. Tuttavia, lo stesso codice funziona senza problemi con Delphi 2007 fino ad oggi. Ho cercato informazioni su Internet e ho scoperto che dovrei usare un CookieManager?
Il fatto è che non sto usando nessuno in Delphi 2007 e quando ne ho assegnato uno in Delphi XE il risultato del mio codice non è cambiato. Sto ancora ricevendo un messaggio sulla sessione scaduta.
Cos'altro posso provare?
Aggiornamento: Ho trovato alcune informazioni che Indy 10 ha problemi con i cookie ma sono stati corretti.
Ho scaricato lo snapshot Indy10_4722, sfortunatamente l'errore si verifica ancora.
Update 2 - Codice fornito
Così, ho preparato un codice di esempio. Questo è compatibile sia con Delphi (2007 e XE). Tuttavia per compilare sotto il 2007 è necessario disporre di GraphicEx library.
Il codice si sta collegando al server reale, carica un'immagine di sicurezza e ne visualizza uno nel modulo. Riscrivi lettere dall'immagine alla casella di modifica e chiudi il modulo. Questo è tutto ciò che devi fare per testarlo.
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('<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.
Update 3
pacchetti di dati per Delphi 2007 esempio are here.
Pacchetti dati per Delphi XE esempio are here.
Programma gratuito per analizzare i pacchetti SmartSniff.
Grazie.
Ok lo farò, ma è meglio che risponda alla mia domanda, signore! ;-) – Wodzu
'TIdHTTP' utilizza internamente un oggetto' TIdCookieManager' implicito se non ne fornisci uno tu stesso. Le vecchie istantanee di Indy 10 avevano alcuni problemi relativi ai cookie, ma le istantanee moderne hanno un sistema di gestione dei cookie completamente riprogettato basato sulle nuove RFC dei cookie rilasciate nel 2011 e, per quanto ne so, funzionano correttamente per i sistemi più conosciuti.Se pensate di avere ancora problemi con i cookie, allora dobbiamo vedere i cookie effettivi e il traffico di richieste/risposte HTTP che li circonda, in modo che possiamo vedere quando i cookie sono o non vengono inviati al server. –
Grazie, oggi fornirò un esempio operativo completo e un esempio completo non funzionante da confrontare. – Wodzu