Java(およびscala)を使用して、少し単純なクライアントサーバーアプリケーションを開発およびテストしています。
このサーバーcom.sun.net.httpserver.HttpServer
は、POST および PUT 操作を使用した基本的な RESTful インターフェースを介したファイルのアップロードに基づいており、これを可能にします。アップロード操作は、独自に実装したダイジェスト認証を使用して制限されており、ブラウザー、curl Apache HttpClient
、.
アップロード クライアントは、HTTP 経由で PUT 操作をラップApache HttpClient 4.1.2
して実行し、ファイル エンティティをアップロードします。ファイルの content-type はapplication/xml
ヘッダーのように指定され、一度に 1 つのファイルのみがアップロードされます。
異なるサイズのファイルをアップロードすると、奇妙な動作が観察される場合があります。
- サイズが 1.076.006 バイト以下のファイルは 正常にアップロードされます。
- サイズが1.122.158 バイト以上のファイルは
、
java.net.SocketException: Broken pipe
.
(最大作業サイズを概算するために手動で異なるサイズのファイルを作成したため、正確な重要なサイズは不明です)
壊れたパイプの理由は、サーバー ログに記録されているように、クライアントがそのサイズの-responseアップロード ファイルを何らかの形で無視したためです。www-authenticate
「無視」とは、認証ヘッダーをまったく含まない複数 (4) のメッセージを送信することを意味します。しかし、より小さいファイルwww-authenticate
はうまく機能し、クライアントは、本来あるべき応答の直後に、適切なチャレンジ応答を含む認証要求を送信します。
アップロードはすべてのサイズのファイルで curl で機能するため、問題はありません。
したがって、この時点で、「クライアントにバグがあります」と言うことができます。わかりました、そう願っていますが、オープンソースの Java RESTclient (Apache httpclient もラップ)も試してみましたが、まったく同じ動作をしています!
インターネット経由でこのクライアントを使用して試してみましたが、説明と同じです。だから今、私はApache HttpClient
この誤った動作につながる重要なものを設定し忘れていて、オープンソースの RESTclient の開発者もそれを見逃していたことを願っています...それが何であるかについてのアイデアは素晴らしいでしょう!