Question

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 the 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.

Was it helpful?

Solution

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),
...
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top