ファイルをダウンロードしています(Apache Tomcat 6.0.32を使用)。切断(Tomcatをシャットダウン)すると、ASHITTPRequestがエラーを生成することがありますが、時々(ほとんどの場合正確に...常に正確に!最初に接続がない場合にのみエラーが発生します)、すべて正しいように動作します。
そこで問題があります: なぜこれが起こったのか、接続が適切に失われたかどうかをどのように監視できるのか。
どうもありがとう!
アップデート:
TCPMon を介してリクエストを送信し、それを停止して (TCPMon)、同じ結果を取得してみてください: ASIHTTPRequest は、ダウンロードが正しく行われたと考えています。
アップデート:
応答ヘッダー:
"Content-Disposition" = attachment;
"Content-Length" = 2277888;
"Content-Type" = "application/octet-stream";
Date = "Thu, 28 Apr 2011 12:35:32 GMT";
Server = "Apache-Coyote/1.1";
"Set-Cookie" = "JSESSIONID=98CAE6C0C4275B528D5E0F8651546AFE; Path=/ISED";
応答ステータス メッセージ:
HTTP/1.1 200 OK
アップデート:
コンピューターを手で外した場合 (ケーブルを外した場合)、次のようになります。
ASIHTTPRequest がタイムアウトになるまで待機し、次のリクエストで接続エラーが発生することがあります。
切断するタイミングでエラーが発生することがあります。
切断したときにエラーが発生しないことがあります。ダウンロードの進行状況が表示されず、(再度接続すると)ファイルが最初からダウンロードを開始します。
ポートを閉じると、ASIHTTPRequest はダウンロードが成功したと判断します。
この論理が理解できない…
解決:
ヘッダーの Content-Length と読み取った合計バイト数を比較して、問題を解決します。
NSString *contentLength = [[self.request responseHeaders] valueForKey:@"Content-Length"];
NSString *downloadedBytesCount = [NSString stringWithFormat:@"%llu",[self.request totalBytesRead]];
if ([contentLength isEqualToString:downloadedBytesCount] == NO) {
// error maintain
}
したがって、すべてのデータを取得したかどうかを確認し、そうでない場合は維持エラーを確認できます。他の場合 (手動で切断するなど) では、ASIHTTPRequest は適切な方法で動作し、自己エラーを生成します。