From 836342abb86b3ff15d1c8319a455d776f7027a87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Wed, 1 Nov 2017 16:27:26 +0000 Subject: Add {switch_handler, Module} return value to cowboy_rest Also {switch_handler, Module, Opts}. Allows switching to a different handler type. This is particularly useful for processing most of the request with cowboy_rest and then streaming the response body using cowboy_loop. --- test/handlers/switch_handler_h.erl | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 test/handlers/switch_handler_h.erl (limited to 'test/handlers') diff --git a/test/handlers/switch_handler_h.erl b/test/handlers/switch_handler_h.erl new file mode 100644 index 0000000..f1580d1 --- /dev/null +++ b/test/handlers/switch_handler_h.erl @@ -0,0 +1,36 @@ +-module(switch_handler_h). + +-export([init/2]). +-export([content_types_provided/2]). +-export([provide/2]). +-export([info/3]). + +init(Req, State) -> + {cowboy_rest, Req, State}. + +content_types_provided(Req, State) -> + {[{<<"text/plain">>, provide}], Req, State}. + +provide(Req0, run) -> + Req = cowboy_req:stream_reply(200, Req0), + send_after(0), + {{switch_handler, cowboy_loop}, Req, 0}; +provide(Req0, hibernate) -> + Req = cowboy_req:stream_reply(200, Req0), + send_after(0), + {{switch_handler, cowboy_loop, hibernate}, Req, 0}. + +send_after(N) -> + erlang:send_after(100, self(), {stream, msg(N)}). + +msg(0) -> <<"Hello\n">>; +msg(1) -> <<"streamed\n">>; +msg(2) -> <<"world!\n">>; +msg(3) -> stop. + +info({stream, stop}, Req, State) -> + {stop, Req, State}; +info({stream, What}, Req, State) -> + cowboy_req:stream_body(What, nofin, Req), + send_after(State + 1), + {ok, Req, State + 1}. -- cgit v1.2.3