Delphi - Indy 10#10600连接超时,POST超过32767字节

时间:2013-11-25 07:33:26

标签: delphi http post indy

我在使用Indy 10时遇到了一个问题,我发布了一个编码为TIdMultiPartFormDataStream的XML字符串,下面给出了我用来调用POST的代码。大多数情况下,这没有问题,但是我在Windows 7上运行时出现重复错误,只有当XML字符串超过32767字节时,才会抛出#10060连接超时套接字错误。问题

我已经确认它与我发布的服务器无关,因为在Windows XP上使用相同代码/应用程序发送的任何大小的邮件都没有问题。

IdHTTP2 := TIdHTTP.Create();

UsingHTTPS := (Pos(LowerCase('https://'), Trim(LowerCase(URL)))> 0);
if UsingHTTPS then begin
IdSSLIOHandlerSocketOpenSSL2:=TIdSSLIOHandlerSocketOpenSSL.Create();
  with IdSSLIOHandlerSocketOpenSSL2 do
  begin
    SSLOptions.Method := sslvTLSv1;
    SSLOptions.Mode := sslmUnassigned;
    SSLOptions.VerifyMode := [];
    SSLOptions.VerifyDepth := 0;
    Port := 443;
  end;
 end; //if UsingHTTPS


try
  try
    with IdHTTP2 do
    begin //with some browser style defaults
      AllowCookies := False;
      ProxyParams.BasicAuthentication := False;
      //ProxyParams.ProxyPort := 0;
      Request.ContentLength := data.Size;
      Request.host := '';
      Request.CustomHeaders.Clear;
      Request.Accept := '';
      Request.ContentEncoding := '';
      IOHandler:=IdSSLIOHandlerSocketOpenSSL2;
      ReadTimeout := -1;
    end;


     //http post
    IdHTTP2.Post(URL, data, response);

有没有人有任何建议来解决这个问题?我试图设置ReadTimeout变量,但这没有变化。任何解决这个问题的指针都将非常感激。

1 个答案:

答案 0 :(得分:1)

TIdSSLIOHandlerSocketOpenSSL属性为< = 0时,

ReadTimeout在Windows Vista +上的SSL套接字上设置硬编码的30秒读/写超时,因此连接速度可能很慢传输数据的时间超过30秒。尝试将ReadTimeout属性设置为更高的值,以查看它是否延迟了错误。如果是这样,那么确实存在传输问题。

您可以使用数据包嗅探器(如Wireshark)来确保数据实际上是及时来回传输的。在引发异常时查看调用堆栈,以查看在SSL握手期间,发送HTTP请求或接收HTTP响应时是否发生超时。这将有助于确定它是OpenSSL,Indy还是服务器的问题。