【问题标题】:Seeing Indy Traffic in Fiddler在 Fiddler 中查看 Indy 流量
【发布时间】:2012-02-10 23:41:48
【问题描述】:

我认为这对于熟悉 Indy 的人来说是一个简单的问题。我正在使用 Delphi 2010 和 Indy 10。我正在尝试开始访问 SSL Web 服务。我认为如果我能让 Fiddler 看到我的 HTTP 流量会容易得多。我在 StackOverflow 上看到过帖子表明让 Fiddler 看到您的 Indy 流量并不是什么大事,您只需配置端口即可使其正常工作。我的问题是你是怎么做到的?

到目前为止,这是我的代码:

procedure TForm1.Button1Click(Sender: TObject);
var slRequest: TStringList;
    sResponse,
    sFileName: String;
    lHTTP: TIdHTTP;
    lIOHandler: TIdSSLIOHandlerSocketOpenSSL;
begin
  sFileName := 'Ping.xml';
  slRequest := TStringList.Create;
  try
    slRequest.LoadFromFile(sFileName);
    lHTTP := TIdHTTP.Create(nil);
    lHTTP.Intercept := IdLogDebug1;
    lIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
    try
      lHTTP.IOHandler := lIOHandler;
      sResponse := lHTTP.Post('https://FSETTESTPROD.EDD.CA.GOV/fsetservice', slRequest);
      Memo1.Lines.Text := sResponse;
    finally
      lIOHandler.Free;
    end;
  finally
    slRequest.Free;
  end;
end;

编辑:如果我不使用 Fiddler 的代理并在 Wireshark 运行时单击按钮,我会在 Wireshark 中获得此流量。

【问题讨论】:

    标签: delphi indy


    【解决方案1】:

    您可以通过设置 ProxyParams 将 Indy 设置为使用 fiddler 提供的代理:

    try
      lHTTP.IOHandler := lIOHandler;
      lHTTP.ProxyParams.ProxyServer := '127.0.0.1';
      lHTTP.ProxyParams.ProxyPort := 8888;
      sResponse := lHTTP.Post('<URL>', slRequest);
      Memo1.Lines.Text := sResponse;
    finally
      lIOHandler.Free;
    end;
    

    你应该能够看到 Fiddler 中的所有流量。

    编辑:如果这不起作用,您可以添加一个 TIdLogDebug 组件并将其添加为拦截器(就像您在问题中所做的那样)。 OnReceive 和 OnSend 事件包含发送和接收的完整标头以及回复数据:

    procedure TForm10.captureTraffic(ASender: TIdConnectionIntercept; 
      var ABuffer: TArray<Byte>);
    var
      i: Integer;
      s: String;
    begin
      s := '';
    
      for i := Low(ABuffer) to High(ABuffer) do
        s := s + chr(ABuffer[i]);
    
      Memo1.Lines.Add(s);
    end;
    

    【讨论】:

    • 我认为它应该这样工作,但是当我这样做时,我在 Fiddler 中收到一条错误消息,上面写着“Fiddler 在会话 #2 中检测到协议违规。内容长度不匹配:请求标头表示 2,208 字节,但客户端发送了 0 字节。”。如果我在发帖前检查 slRequest,里面有数据。
    • 我忘了说我的程序在 Post 行冻结了。当我终止程序时,我收到错误消息。
    • 您的机器上是否安装了 OpenSSL? Indy 需要二进制文件。此外,您原始问题中的页面为我返回了 404 错误。
    • 使用ProxyParams 时,TIdHTTP 连接代理并发送CONNECT 请求,然后发送POST 命令。 TIdHTTP 肯定会发送帖子数据,所以我怀疑是 Fiddler 问题,而不是 TIdHTTP 问题。我建议使用 Wireshark 来验证 TIdHTTP 实际发送的内容。
    • @Chris 我确实安装了 OpenSSL,并且我在应用程序文件夹中有两个 dll。您对 404 的看法是正确的。如果我用 Chrome 尝试它,我也会明白这一点。如果我最后取消 fsetservice,那么我会在 Chrome 中显示该页面可用。我将不再使用 fset 服务。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    相关资源
    最近更新 更多