La lectura en Erlang el cuerpo de una petición HTTP que se recibe
Pregunta
He estado buscando en Mochiweb, pero no puedo encontrar una manera de leer el cuerpo mientras estoy de recibir la solicitud a través de la toma de corriente.
No estoy limitado a Mochiweb, cualquier otra librería HTTP sería bueno para mí.
También probé gen_tcp:listen(Port, [{packet, http}])
, de esta manera puedo leer el cuerpo / cabeceras mientras estoy recibiendo la petición HTTP, pero debe manejar manualmente las respuestas y mantener el socket abierto para más peticiones, así que prefiero no utilizar esta solución .
Mi intención es recibir la solicitud con cuerpos grandes y no esperar a recibir el cuerpo completo con el fin de comenzar a leer / procesarlos.
Solución
Con mochiweb se puede doblar sobre trozos del cuerpo de la petición utilizando Req:stream_body/3
.
Se espera que una función de controlador trozo como el segundo argumento. Este controlador es llamada con
{ChunkSize, BinaryData}
y su estado para cada trozo, ya que se recibe desde el zócalo.
Ejemplo (recuperar una lista [invertido] de trozos):
MaxChunkSize = 100,
InitialState = [],
ChunkHandler = fun ({_Size, Bin}, State) -> [Bin | State] end,
List = Req:stream_body(MaxChunkSize, ChunkHandler, InitialState),
...