Чтение в Erlang тела HTTP-запроса по мере его поступления - PullRequest
3 голосов
/ 30 ноября 2010

Я изучал Mochiweb, но не могу найти способ прочитать тело, пока получаю запрос через сокет.

Я не ограничен Mochiweb, любая другая HTTP-библиотека подойдет мне.

Я также пытался gen_tcp:listen(Port, [{packet, http}]), таким образом я могу читать тело / заголовки, пока я получаю HTTP-запрос, но я должен вручную обрабатывать ответы и держать сокет открытым для большего количества запросов, поэтому я предпочитаю не использовать это решение.

Мое намерение - получить запрос с большими телами, а не ждать получения полного тела, чтобы начать читать / обрабатывать их.

1 Ответ

3 голосов
/ 30 ноября 2010

С mochiweb вы можете сложить куски тела запроса, используя Req:stream_body/3.Он ожидает функцию обработчика чанка в качестве второго аргумента.Этот обработчик вызывается с {ChunkSize, BinaryData} и вашим состоянием для каждого чанка, как он получен из сокета.

Пример (получение [чередующегося] списка чанков):

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