2012-01-02 17 views
11

Estoy intentando transferir mi código de Delphi 2007 a Delphi XE (sin actualización 1 todavía). El problema con el que me he tropezado es que en Delphi XE recibo una respuesta diferente del servidor después de enviar un segundo mensaje GET.TIdHTTP - la sesión ha caducado mensaje en Delphi XE

El mensaje en formato HTML dice que mi sesión ha expirado. Sin embargo, el mismo código funciona sin problemas en Delphi 2007 hasta el día de hoy. ¿Busqué información en Internet y descubrí que debería usar un CookieManager?

La cosa es que no estoy usando ninguno en Delphi 2007 y cuando asigné uno en Delphi XE el resultado de mi código no ha cambiado. Aún estoy recibiendo un mensaje sobre la sesión caducada.

¿Qué más puedo probar?

Actualización: He encontrado información de que Indy 10 tiene problemas con las cookies, pero se solucionaron.

He descargado la instantánea Indy10_4722, desafortunadamente el error todavía ocurre.

Actualización 2 - Código proporciona

Por lo tanto, hemos preparado un código de ejemplo. Esto es compatible tanto con Delphi (2007 y XE). Sin embargo, para compilarlo en 2007 necesita tener GraphicEx library.

El código se está conectando al servidor real, carga una imagen de seguridad y lo muestra uno en el formulario. Vuelva a escribir las letras de la imagen en el cuadro de edición y cierre el formulario. Eso es todo lo que necesita hacer para probarlo.

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. 

Actualización 3

paquetes de datos para Delphi 2007 are here ejemplo.

Paquetes de datos para Delphi XE ejemplo are here.

Programa gratuito para analizar paquetes SmartSniff.

Gracias.

+0

Ok lo haré, pero será mejor que respondas a mi pregunta señor! ;-) – Wodzu

+3

'TIdHTTP' utiliza un objeto implícito' TIdCookieManager' internamente si no proporciona uno usted mismo. Las instantáneas anteriores de Indy 10 tenían algunos problemas relacionados con las cookies, pero las instantáneas modernas tienen un sistema de manejo de cookies completamente rediseñado que está basado en nuevas RFC de cookies lanzadas en 2011 y, hasta donde sé, funcionan correctamente para la mayoría de los sistemas conocidos.Si cree que todavía tiene problemas con las cookies, entonces necesitamos ver las cookies reales y el tráfico de solicitud/respuesta HTTP que las rodea para que podamos ver cuándo se envían o no las cookies al servidor. –

+0

Gracias, hoy proporcionaré un ejemplo de trabajo completo y un ejemplo completo que no funciona para comparar. – Wodzu

Respuesta

1

Creo que debería considerar inspeccionar la solicitud utilizando algunas herramientas como httpanalyzer o fiddler.

Primero use Internet Explorer y vea cómo hace la solicitud.

Luego use su aplicación y compare ambas solicitudes. Si se trata de un problema de cookies, verá lo que está mal.

Keep-alive no es su respuesta. Solo hace que su conexión no se deje caer en cada solicitud al mismo servidor. Ver Wikipedia

Cuestiones relacionadas