0

IdHTTPProxyServer から取得した GET/POST をインターセプトして IdHTTP に送信しようとしています。これにより、GET/POST を複製し、最終的に Cookie を取得して、任意の Web サイトにログインできるようになります。

これはどのように改善できますか?このコードを実行しようとすると、クラッシュします。

procedure TForm1.IdHTTPProxyServer1HTTPDocument(
  AContext: TIdHTTPProxyServerContext; var VStream: TStream);
begin

if AContext.Command='POST' then begin
EmbeddedWB1.LoadFromString(IdHTTP1.Post(AContext.Target,AContext.Headers.Text)); << CRASH
end;

if AContext.Command='GET' then begin
EmbeddedWB1.LoadFromString(IdHTTP1.Get(AContext.Target)); << CRASH
end;

end; 
4

1 に答える 1

1

OnHTTPDocumentイベントを使用する場合は、TIdHTTPProxyServerContext.TransferSourceプロパティを調べて、イベントが本文データを含むクライアント リクエストに対してトリガーされているかどうか、またはクライアント リクエストに対するターゲット サーバーの応答に対してトリガーされているかどうかを確認する必要があります。独自のGET/POSTリクエストを送信することは、クライアント リクエストを処理する場合にのみ意味がありますが、キャプチャする本文データがないOnHTTPDocumentため、リクエストに対してイベントがトリガーされることはほとんどありません。GET

TIdHTTPサーバーの Cookie を取得するために使用する必要はありません。TIdHTTPProxyServer通常どおり動作させてから、イベントでプロパティから Cookie を抽出できます。たとえば、次TIdHTTPProxyServerContext.Headersのようになります。OnHTTPResponse

procedure TForm1.IdHTTPProxyServer1HTTPResponse(AContext: TIdHTTPProxyServerContext);
var
  Cookies: TStringList;
begin
  Cookies := TStringList.Create;
  try
    AContext.Headers.Extract('Set-Cookie', Cookies);
    // use Cookies as needed, such as:
    // URI := TIdURI.Create(AContext.Target);
    // try
    //   CookieManager1.AddServerCookies(Cookies, URI);
    // finally
    //   URI.Free;
    // end;
  finally
    Cookies.Free;
  end;
end;
于 2012-11-08T18:47:47.340 に答える