私は Indy サーバーを持っており、URL がファイルを要求したときにファイルを送信するのは簡単で、常に正しく動作しているようです。
しかし、次のような 2 番目のケースも設定しようとしています。
http://example.com/getFile.html?filename=myImage.png
(これは動的に生成されたコンテンツで機能するため、静的ファイルを要求しても機能しません。) 私はカスタム Indy クライアントを使用してTIdHTTP.Get
おり、これらすべてのファイルを取得するために呼び出しています。2 番目の使用例では、このアルゴリズムに従っているようです。 :
Roll 1D4. If you rolled 2 or higher, download correctly.
Otherwise, roll 1D6 against this table of Indy exceptions and
raise one of them.
If a random exception is raised, it MUST NOT be caught inside
of Indy code.
これまでのところ、一般的なものはEIdHTTPProtocolException
、EIdClosedSocket
、およびEIdNotConnected
のようですが、他にもいくつか見てきました。これらをキャッチしてダウンロードを再試行するように例外ハンドラーを設定すると、場合によっては機能することもありますが、別の場合には、さらに多くの例外が発生します。
静的ダウンロードの使用例を使用するとこれが決して起こらないという事実は、私のコードが適切に説明していない 2 番目の使用例の内部でおそらく奇妙なことが起こっていることを示しています。
コードは実にシンプルです。クライアント側:
procedure TdmConnection.GetFile(const URL: string; stream: TStream);
procedure Retry;
begin
sleep(100);
stream.Size := 0; //clear any aborted partial download
http.Get(URL, stream);
end;
begin
try
http.Get(URL, stream);
except
on EIdClosedSocket do
Retry;
on EIdNotConnected do
Retry;
on EIdHTTPProtocolException do
Retry;
end;
end;
そしてサーバー側では、要求はファイルを生成するスクリプトを実行し (正確に; 私はその部分を確認しました)、それを HTTP 応答として返すように Indy サーバーに指示します。単純に a を開いてTFileStream
に割り当てようとしましたが、オブジェクトでメソッドをResponse.ContentStream
呼び出してみましたが、クライアント側でも同じエラーが発生します。サーバー コードの関連部分は次のようになります。ServeFile
Response
if lServeFile <> '' then begin //variable set by the script
if lServeFile = '***' then
response.ResponseNo := 404
else begin
response.ResponseNo := 200;
response.ServeFile(AContext, lServeFile);
end;
end;
経験豊富な Indy ユーザーは、私が間違っていることを知っていますか? Delphi XE に付属の Indy 10 を使用。