2012-01-02 9 views
11

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 
     + '&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. 

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.

+0

Ok lo farò, ma è meglio che risponda alla mia domanda, signore! ;-) – Wodzu

+3

'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. –

+0

Grazie, oggi fornirò un esempio operativo completo e un esempio completo non funzionante da confrontare. – Wodzu

risposta

1

Penso che dovresti considerare di ispezionare la richiesta utilizzando alcuni strumenti come httpanalyzer o fiddler.

Per prima cosa utilizzare Internet Explorer e vedere come funziona la richiesta.

Quindi utilizzare l'app e confrontare entrambe le richieste. Se è un problema con i cookie, vedrai cosa c'è che non va.

Keep-alive non è la risposta. Rende solo la connessione a non essere rilasciata su ogni richiesta allo stesso server. Vedi Wikipedia