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
+ '®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.
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.
Ok lo haré, pero será mejor que respondas a mi pregunta señor! ;-) – Wodzu
'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. –
Gracias, hoy proporcionaré un ejemplo de trabajo completo y un ejemplo completo que no funciona para comparar. – Wodzu