2010-12-07 12 views
0

SSL接続をプロキシするプロキシサーバーを作成していますが、通常のトラフィックではすべて正常に動作しています。しかし、電子メールの添付ファイルのような大きなファイル転送(20KBを超えるもの)があると、ファイルの書き込みが完了する前にTCPレベルで接続がリセットされます。私はノンブロッキングIOを使用しており、特定の接続ごとにスレッドを生成しています。 SSL接続の途中での処理を処理する方法

接続は、私は次の操作を行うにしてい

  • スポーンスレッドクライアントへ
  • 接続(暗号化されていない)と接続要求(他のすべての要求は無視されます)
  • 作成を読みますサーバーに接続したことをクライアントに伝える(暗号化されていない)
  • クライアントとの安全な接続を作成し、クライアントとの間でプロキシデータを開始します。 2つはselectループを使用して読み取りと書き込みが発生するかどうかを判断します
  • 基になるソケットが閉じられるか、エラーが発生すると接続は閉じられ、スレッドは終了します。

通常のサイズのデータ​​(通常のWebページなど)ではうまく動作しますが、ファイルが大きすぎるとエラーコード(使用されているWebアプリケーションによって異なります)またはエラー:接続が中断されました。

TCP、HTTP、SSLのいずれかに関係なく、何が接続を閉じる原因になっているかわかりません。その情報はまったく見つかりません。いくつかのブラウザでは、SSL_writeの直後にsleep文を書くと動作しますが、これは他のブラウザで他の問題を引き起こすようです。睡眠は長くなる必要はなく、実際には遅れが生じる。私は現在、書き込みごとに4ms、読み取りごとに2msに設定しています。これは古いFirefox、HTTPアップロードのChrome、オペラで完全に修正されています。

これ以上の情報が必要な場合は、どんなリードもありがとうございます。ありがとうございました!

-SAM

+0

私はあなたが問題を示すためにいくつかのコードを投稿する必要があると思います。 – caf

答えて

0

ウェブアプリは、アップロードされたファイルは、それが何をするのかが大きすぎると考えている場合は?接続を閉じるだけであれば、送信側でECONNが発生します: '接続のリセット'。それが何であれ、プロキシを書いているときに、あなたのコードにこれを引き起こすバグはないと仮定すると、上流の接続に何が起こったのかを下流の接続に戻すことがミッションです。この場合、答えはあなたがやっていることだけです:アップストリームとダウンストリームのソケットを閉じます。サーバーからclose_notifyを受信した場合は、正常なSSLをクライアントに近づけます。 ECONNを取得した場合は、SSLをバイパスして直接クライアントソケットを閉じてください。

+0

これ以外のプロキシのアップストリーム動作をミラーリングしています。接続を閉じる理由はなく、プロキシがエラーハンドラ内のSSL_ERROR_SYSCALLに入るたびに、基底のソケットに0(成功)の報告をする必要があります。ドキュメンテーションによると、これは不正なシャットダウンを示す予期しないEOFである可能性が高いと言われていますが、サーバーは接続をシャットダウンしていませんでした。 –

+0

*いくつかのエラーがあったに違いありません。それは何でもダウンストリームに複製する必要があります。 – EJP

関連する問題