Indy TIdHTTP.Postがハングする(Delphi 10.3 RIO)

2020-07-31 delphi indy

IndyメソッドTIdHTTP.Postを実行しようとすると、ハングします。

  LStream := TStringStream.Create(
        Trim(' <req>                              ')
      + Trim('   <query>' + AInput + '</query>    ')
      + Trim('   <count>10</count>                ')
      + Trim(' </req>                             ')
    , TEncoding.UTF8
  );

    LIdHTTP := TIdHTTP.Create(nil);
    try
      LIdHTTP.IOHandler := sslHandler;
      LIdHTTP.AllowCookies := True;
      LIdHTTP.HandleRedirects := True;
    
      LIdHTTP.HTTPOptions := [];
    
      LIdHTTP.Request.ContentEncoding := 'utf-8';
      LIdHTTP.Request.ContentType := 'application/xml';
      LIdHTTP.Request.Accept := 'application/xml';
      LIdHTTP.Request.CustomHeaders.Add('Authorization: Token 1953c2596abe61b709cdec5fc6c7ca2ae4ac709d');
    
      Result := LIdHTTP.Post('http://suggestions.dadata.ru/suggestions/api/4_1/rs/suggest/address', LStream);
    finally
      LIdHTTP.Free;
    end;

行IdIOHandlerでハングアップします:ReadBytes(LBuf、i、False);パラメータ:AByteCount = 32768、AAppend = False。

また、プロキシ経由で別のPCから起動しても、ハングアップすることはありません。

なぜでしょうか?

UPD :2020.08.01

短い情報でごめんなさい。

はい、ReadTimeoutプロパティを指定しない場合、期待される正しい応答が得られますが 、長いタイムアウト( 〜1分 )の後、内部例外 "接続は正常に閉じられました"が返されますが、結果は受信されます。 Postメソッドの呼び出しでReadBytesを呼び出す際のタイムアウト。

ReadTimeoutプロパティを指定すると、「タイムアウトに達しました」という例外がキャッチされ、Postメソッドから結果が返されません。

まだ答えを探しています。

そして興味深いのは、プロキシサーバーがどこにある私の仕事用PCからでも、すぐに正しい答えが得られ、エラーがないということです。プロキシ経由。

UPD_2 :2020.08.01

問題が解決しました。

公式のIndyリポジトリから、SSL Libs: OpenSSL-BinariesがGithubにあるアーカイブをダウンロードしました。そして、そのうちの1つからdllを、私のプログラムのフォルダーであるopenssl-1.0.2s-i386-win32に解凍しました

次に、プログラムのコードでhttpではなくhttpsプレフィックスを指定しました。 そして、すべてがタイムアウトなしで機能しました。

明らかに、プロキシサーバーはそれ自体で異なるプロトコルhttp / httpsを使用しました、おそらくそれはタイムアウトを認識し、 httpsに切り替えました。そして、それが私の仕事でPCプログラムが機能し、自宅のPCでは機能しなかった理由です(プロキシなし)。

しかし、私にははっきりしない瞬間があります。

瞬間1)非表示の内部Indy例外が表示される場合があります:「接続は正​​常に閉じられました」。その理由は明らかではありません。プログラムには表示されず、デバッグ中にのみ表示されます。それはどういう意味ですか、なぜ表示されるのですか?

モーメント2)最終的にHTTPリンクを介して結果を受け取るのはなぜですか?結果は表示されますが、タイムアウトが発生します。タイムアウトを削除してhttpプロトコルを使用する方法はありますか?

モーメント3) SSLライブラリのその他のリビジョンを使用しようとすると、「SSLライブラリをロードできませんでした」というエラーが表示されるのはなぜですか? openssl-1.0.2topenssl-1.0.2uを試しましたが 、エラーでした。 openssl-1.0.2sのみがエラーなしで機能しました。

ありがとうございました!

Answers

Related