2010-11-30 9 views
3

Mochiweb을 조사해 봤지만 소켓을 통해 요청을받는 동안 본문을 읽을 수있는 방법을 찾을 수 없습니다.Erlang에서 수신 된 HTTP 요청 본문을 읽음

저는 Mochiweb에 국한되지 않고, 다른 어떤 HTTP 라이브러리도 좋을 것입니다.

gen_tcp:listen(Port, [{packet, http}])도 HTTP 요청을 수신하는 동안 body/headers를 읽을 수 있지만 수동으로 응답을 처리하고 더 많은 요청을 위해 소켓을 열어 두어야하므로이 것을 사용하지 않는 것이 좋습니다. 해결책.

본인의 의도는 큰 몸체로 요청을 받고 전신을 읽고 받기를 기다리기 위해서입니다.

답변

3

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), 
... 
+0

이 정의 요청 처리기 내부에서 수행되어야

예 (청크 [반전]에서 입수)? 그러나 요청 처리기는 전체 요청을 받으면 호출됩니다. Req : stream_body (...)가 소켓을 통해 도착하는 동안 본문을 읽는 방법을 알지 못합니다. 나는 뭔가 틀렸어 야하지만 어디에 있는지 모른다. – Ricardo

+0

헤더가 읽히 자마자 요청 핸들러가 매우 일찍 호출됩니다. 핸들러 내부에서'Req : recv_body/0'를 사용하여 전체 요청을 받거나'Req : stream_body/3'를 사용하여 처리 할 수 ​​있습니다. 'stream_body'의 구현은 청크로 된 소켓으로부터 데이터를 읽고 청크 핸들러 함수에 전달합니다. 나를 믿어 라. –

+0

좋습니다. 도와 줘서 고맙다. – Ricardo

관련 문제