J'essaie de créer une application prenant en charge la session en utilisant idhttp 10.5.7 sur Delphi XE, mais la session est toujours modifiée chaque fois que j'appelle la requête.Session non gérée avec indy 10 idhttp et Delphi XE
Mais ensuite j'utilise le même code dans Delphi 2006 en utilisant indy 10.1.5 la session s'est bien maintenue, même quand j'appelle la requête plusieurs fois, elle ne crée qu'une seule session.
Comment résoudre ce problème dans Delphi XE?
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdCookieManager, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, IdHTTP, StdCtrls,iduri,IdCookie;
type
TForm1 = class(TForm)
HTTP: TIdHTTP;
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
function get_dataweb(url: string): string;
procedure OnNewCookie(ASender: TObject; ACookie: TIdCookieRFC2109; var VAccept: Boolean);
{ Private declarations }
public
Stream : TStringStream;
cookie : TIdCookieManager;
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var hasil : string;
begin
hasil := get_dataweb('http://localhost/web/tes.php');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Stream := TStringStream.Create;
cookie := TIdCookieManager.Create;
cookie.OnNewCookie := OnNewCookie;
HTTP.CookieManager := cookie;
end;
procedure TForm1.OnNewCookie(ASender: TObject; ACookie: TIdCookieRFC2109; var VAccept: Boolean);
begin
memo1.Lines.Add(ACookie.CookieText);
end;
function TForm1.get_dataweb(url:string):string;
var hasil : string;
begin
stream.Position := 0;
stream.Size := 0;
http.AllowCookies := True;
http.HandleRedirects := True;
HTTP.ReadTimeout := 0;
HTTP.ConnectTimeout := 0;
HTTP.Request.CustomHeaders.clear;
HTTP.Request.CustomHeaders.Add('user:user');
HTTP.Request.CustomHeaders.Add('password:password');
HTTP.request.useragent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0';
try
http.get(url,Stream);
hasil := Stream.DataString;
except
on E: EIdHTTPProtocolException do
begin
hasil := E.ErrorMessage;
result := hasil;
exit;
end;
on E: Exception do
begin
ShowMessage('Failed, ' + E.Message + #13#10 + ' ' + hasil);
end;
end;
result := hasil;
end;
end.
3 fois i cliqué sur le bouton, 3 fois nouvelle session créé
10.5.7 est très vieux, la version actuelle est 10.6.2. En tout cas, c'est clairement un problème de cookie. La gestion des cookies a beaucoup changé depuis 10.1.5 et même 10.5.7, pour suivre de plus près les pratiques de cookies modernes. Il y a donc de fortes chances que votre ancien TIdHTTP rejette les cookies ou ne les renvoie pas au serveur, car il pense qu'ils ne correspondent pas aux requêtes en cours. Cela expliquerait pourquoi de nouvelles sessions sont créées sur chaque requête. Je ne suis pas capable de reproduire ce problème dans 10.6.2, les sessions sont réutilisées comme prévu. –