2017-05-17 18 views
0

私は竜巻RequestHandler@tornado.web.stream_request_bodyデコレータを持っていて、ハンドラへのチャンクストリーミングを許可しています。竜巻のストリーミングリクエストを正常に終了

ストリーミングを許可する前に、認証などのチェックを行う必要があります。マイprepare()方法を

requests.exceptions.ConnectionError: [Errno 32] Broken pipe

:私はRequestHandler.prepare()方法でこれらを実装しようとしたが、私はハンドラにデータをストリーミングするrequestsを使用する場合、およびチェックが失敗し、接続が突然閉鎖され、私は例外を参照してください次のようになります。

def prepare(self): 
    check = some_function() 
    if not check: 
     self.set_status(400) 
     self.write('some error message') 
     self.finish() 
     return 

は、どのように私は、要求が正常に閉じられているチェックが失敗した場合ので、私はクライアントにエラーメッセージを返すことができることを確認することができますか?

+0

'@coroutine'で' prepare'をラップしようとすると、それはあなたがチェックを終えるのを待つようにします。したがって、 'some_function'もコルーチンである必要があります。 – desertkun

答えて

0

これをHTTP/1で正常に処理するのは難しいです。ほとんどのクライアントは単にリクエストを盲目的に書くだけで、完全なリクエストが書かれるまでサーバーからの応答を探しません。したがって、すべてのものを送信しないようにする唯一の方法は、接続を突然シャットダウンすることです。

動作は、わかりにくいHTTP機能100-continueにあります。 クライアントがこれをサポートしている場合は、prepare()が完了してリクエストがアップロードされる前にエラーがないかどうかを確認します。 requestsはこの機能をサポートしていません。 TornadoのデフォルトHTTPクライアントは、フェッチにexpect_100_continue=Trueを渡した場合、行います。