http_loop_stream_recv.erl 864 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. %% Feel free to use, reuse and abuse the code in this file.
  2. -module(http_loop_stream_recv).
  3. -export([init/3]).
  4. -export([info/3]).
  5. -export([terminate/3]).
  6. init({_, http}, Req, _) ->
  7. receive after 100 -> ok end,
  8. self() ! stream,
  9. {loop, Req, 1, 100}.
  10. info(stream, Req, Id) ->
  11. case stream_next(Req) of
  12. {ok, Id, Req2} ->
  13. info(stream, Req2, Id+1);
  14. {done, Req2} ->
  15. {ok, Req3} = cowboy_req:reply(200, Req2),
  16. {ok, Req3, Id}
  17. end.
  18. terminate({normal, shutdown}, _, _) ->
  19. ok.
  20. stream_next(Req) ->
  21. stream_next(<<>>, Req).
  22. stream_next(Buffer, Req) ->
  23. case cowboy_req:stream_body(Req) of
  24. {ok, Packet, Req2} ->
  25. case <<Buffer/binary, Packet/binary>> of
  26. <<Id:32>> ->
  27. {ok, Id, Req2};
  28. Buffer2 when byte_size(Buffer2) < 4 ->
  29. stream_next(Buffer2, Req2);
  30. _InvalidBuffer ->
  31. {error, invalid_chunk}
  32. end;
  33. Other ->
  34. Other
  35. end.