将代理GET / POST发送到WebBrowser

时间:2012-11-08 18:17:58

标签: delphi delphi-xe2 indy indy10

我试图拦截我从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; 

1 个答案:

答案 0 :(得分:1)

使用OnHTTPDocument事件时,您需要查看TIdHTTPProxyServerContext.TransferSource属性,以了解是否为包含正文数据的客户端请求触发了事件,或者是否正在为目标服务器触发事件响应客户端请求。发送您自己的GET / POST请求仅在处理客户端请求时才有意义,但是OnHTTPDocument请求不太可能触发GET事件,因为没有身体数据捕获。

您无需使用TIdHTTP即可获取服务器的Cookie。让TIdHTTPProxyServer正常工作,然后您可以从TIdHTTPProxyServerContext.Headers事件中的OnHTTPResponse属性中提取Cookie,例如:

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;