http_loop_stream_recv.erl 730 B

12345678910111213141516171819202122232425262728293031323334
  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, undefined, 100}.
  10. info(stream, Req, undefined) ->
  11. stream(Req, 1, <<>>).
  12. stream(Req, ID, Acc) ->
  13. case cowboy_req:body(Req) of
  14. {ok, <<>>, Req2} ->
  15. {ok, Req3} = cowboy_req:reply(200, Req2),
  16. {ok, Req3, undefined};
  17. {_, Data, Req2} ->
  18. parse_id(Req2, ID, << Acc/binary, Data/binary >>)
  19. end.
  20. parse_id(Req, ID, Data) ->
  21. case Data of
  22. << ID:32, Rest/bits >> ->
  23. parse_id(Req, ID + 1, Rest);
  24. _ ->
  25. stream(Req, ID, Data)
  26. end.
  27. terminate({normal, shutdown}, _, _) ->
  28. ok.