Leggendo in Erlang corpo di una richiesta HTTP la riceve
Domanda
ho cercato in Mochiweb, ma non riesco a trovare un modo per leggere il corpo mentre sto ricevendo la richiesta attraverso la presa.
io non sono limitato a Mochiweb, qualsiasi altra libreria HTTP sarebbe un bene per me.
Ho provato anche gen_tcp:listen(Port, [{packet, http}])
, in questo modo posso leggere il corpo / intestazioni mentre sto ricevendo la richiesta HTTP, ma devo gestire manualmente le risposte e mantenendo il socket aperto per ulteriori richieste, quindi preferisco non usare questa soluzione .
La mia intenzione è quella di ricevere richiesta con i corpi di grandi dimensioni e di non aspettare di ricevere il corpo pieno, al fine di iniziare la lettura / elaborarli.
Soluzione
Con mochiweb si può piegare pezzi del corpo della richiesta utilizzando Req:stream_body/3
.
Si aspetta una funzione di gestione pezzo come secondo argomento. Questo gestore viene chiamato con
{ChunkSize, BinaryData}
e il tuo stato per ogni pezzo, in quanto viene ricevuto dalla presa.
Esempio (il recupero di un [invertito] elenco dei pezzi):
MaxChunkSize = 100,
InitialState = [],
ChunkHandler = fun ({_Size, Bin}, State) -> [Bin | State] end,
List = Req:stream_body(MaxChunkSize, ChunkHandler, InitialState),
...