2010-11-30 8 views
3

Ich habe in Mochiweb untersucht, aber ich finde keine Möglichkeit, den Körper zu lesen, während ich die Anfrage über den Socket erhalte.In Erlang den Körper einer HTTP-Anfrage einlesen, wie sie empfangen wird

Ich bin nicht auf Mochiweb beschränkt, jede andere HTTP-Bibliothek wäre gut für mich.

Ich versuchte auch gen_tcp:listen(Port, [{packet, http}]), auf diese Weise kann ich lesen, die Körper/Header, während ich die HTTP-Anfrage empfange, aber ich muss manuell die Antworten und halten den Socket offen für weitere Anfragen, so dass ich es lieber nicht verwenden Lösung.

Meine Absicht ist es, Anfrage mit großen Körpern zu erhalten und nicht zu warten, um den vollständigen Körper zu erhalten, um zu beginnen, sie zu lesen/zu verarbeiten.

Antwort

3

Mit mochiweb können Sie Stücke des Anfragekörpers unter Verwendung Req:stream_body/3 falten. Es erwartet eine Chunk-Handler-Funktion als zweites Argument. Dieser Handler wird mit {ChunkSize, BinaryData} und Ihrem Status für jeden Chunk aufgerufen, wie er vom Socket empfangen wird.

Beispiel (Abrufen einer [umgekehrt] Liste der Chunks):

MaxChunkSize = 100, 
InitialState = [], 
ChunkHandler = fun ({_Size, Bin}, State) -> [Bin | State] end, 
List = Req:stream_body(MaxChunkSize, ChunkHandler, InitialState), 
... 
+0

Dies muss innerhalb der definierten Anforderungshandler getan werden? Aber der Request-Handler wird aufgerufen, wenn die vollständige Anfrage empfangen wurde, oder? Ich sehe nicht, wie 'Req: stream_body (...)' den Körper liest, während er durch den Sockel ankommt. Ich muss mich in etwas irren, weiß aber nicht wo. – Ricardo

+0

Der Request-Handler wird sehr früh aufgerufen, sobald die Header gelesen wurden. Innerhalb des Handlers können Sie entweder die vollständige Anfrage mit 'Req: recv_body/0' erhalten oder sie mit' Req: stream_body/3' streamen. Die Implementierung von 'stream_body' liest Daten aus dem Socket in Chunks und übergibt sie an Ihre Chunk-Handler-Funktion. glaub mir, es funktioniert! –

+0

OK, das macht Sinn. Danke für deine Hilfe Felix. – Ricardo