0

我试图拦截从 IdHTTPProxyServer 获取的 GET/POST 并将其发送到 IdHTTP,以便我可以复制 GET/POST 并最终获取 cookie,以便我可以登录到任何网站。

如何改进?如果我尝试执行此代码,它会崩溃。

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正常工作,然后您可以从事件中的TIdHTTPProxyServerContext.Headers属性中提取cookie 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 回答