2017-05-17 4 views
0

Ich habe eine Tornado RequestHandler mit der @tornado.web.stream_request_body Dekorator, um chunked Streaming an den Handler zu ermöglichen.Anmutig schließen Tornado Streaming-Anfrage

Ich muss Authentifizierung und einige andere Überprüfungen vor dem Streaming durchführen. Ich habe versucht, diese in den RequestHandler.prepare() Verfahren zu implementieren, aber wenn ich requests verwenden, um Daten an die Prozedur zu streamen, und die Prüfungen nicht besteht, wird die Verbindung abrupt geschlossen, und ich sehe eine Ausnahme:

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

Meine prepare() Methode wie folgt aussieht:

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

Wie kann ich die Anforderung stellen Sie sicher, anmutig so geschlossen ist, ich eine Fehlermeldung an den Client zurückgeben kann, wenn die Prüfungen nicht?

+0

Sie können versuchen, 'prepare' mit' @ coroutine' zu ​​verbinden, damit Tornado auf die Überprüfung wartet. Daher muss "Some_function" auch eine Coroutine sein. – desertkun

Antwort

0

Es ist schwierig, dies in HTTP/1 anmutig zu handhaben. Die meisten Clients schreiben die Anfrage einfach blind und suchen nicht nach einer Antwort vom Server, bis sie die vollständige Anfrage geschrieben haben. Die einzige Möglichkeit, sie daran zu hindern, das Ganze zu senden, besteht darin, die Verbindung abrupt zu beenden.

Das gewünschte Verhalten wird in einer obskuren HTTP-Funktion namens 100-continue gefunden. Wenn der Client dies unterstützt, wartet er auf prepare(), um zu beenden, um festzustellen, ob vor dem Hochladen der Anforderung ein Fehler aufgetreten ist. requests unterstützt diese Funktion nicht. Der Standard-HTTP-Client von Tornado funktioniert, wenn Sie expect_100_continue=True beim Fetch übergeben.