Reading in Erlang the body of a HTTP request as it is received
I've been looking into Mochiweb, but I can't find a way to read the body while I'm receiving the request through the socket.
I'm not limited to Mochiweb, any other HTTP library would be good for me.
I also tried gen_tcp:listen(Port, [{packet, http}])
, this way I can read the body/headers while I'm receiving the HTTP request, but I must handle manually the responses and keeping t开发者_运维百科he socket open for more requests, so I prefer not to use this solution.
My intention is to receive request with large bodies and not to wait to receive the full body in order to start reading/processing them.
With mochiweb you can fold over chunks of the request body using Req:stream_body/3
.
It expects a chunk handler function as the second argument. This handler is called with
{ChunkSize, BinaryData}
and your state for every chunk, as it is received from the socket.
Example (retrieving a [reversed] list of chunks):
MaxChunkSize = 100,
InitialState = [],
ChunkHandler = fun ({_Size, Bin}, State) -> [Bin | State] end,
List = Req:stream_body(MaxChunkSize, ChunkHandler, InitialState),
...
精彩评论