From 5e006be01fb9af2cbb6b62bec695a2c160733cf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Mon, 10 Oct 2011 17:27:52 +0200 Subject: Add support for loops in standard HTTP handlers Now init/3 can return one of the following values to enable loops: - {loop, Req, State} - {loop, Req, State, hibernate} - {loop, Req, State, Timeout} - {loop, Req, State, Timeout, hibernate} Returning one of these tuples will activate looping in the HTTP handler. When looping, handle/2 is never called. Instead, Cowboy will listen for Erlang messages and forward them to the info/3 function of the handler. If a timeout is defined, Cowboy will also close the connection when no message has been received for Timeout milliseconds. The info/3 function is defined as info(Msg, Req, State). It can return either of the following tuples: - {ok, Req, State} - {loop, Req, State} - {loop, Req, State, hibernate} The first one ends the connection, calling terminate/2 before closing. The others continue the loop. Loops are useful when writing long-polling handlers that need to wait and don't expect to receive anything. Therefore it is recommended to set a timeout to close the connection if nothing arrives after a while and to enable hibernate everywhere. Normal HTTP handlers shouldn't need to use this and as such info/3 was made optional. --- test/http_SUITE.erl | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'test/http_SUITE.erl') diff --git a/test/http_SUITE.erl b/test/http_SUITE.erl index 187d5af..d32804e 100644 --- a/test/http_SUITE.erl +++ b/test/http_SUITE.erl @@ -97,6 +97,7 @@ init_http_dispatch() -> {[<<"ws_timeout_hibernate">>], ws_timeout_hibernate_handler, []}, {[<<"ws_init_shutdown">>], websocket_handler_init_shutdown, []}, {[<<"init_shutdown">>], http_handler_init_shutdown, []}, + {[<<"long_polling">>], http_handler_long_polling, []}, {[<<"headers">>, <<"dupe">>], http_handler, [{headers, [{<<"Connection">>, <<"close">>}]}]}, {[], http_handler, []} @@ -227,7 +228,8 @@ raw(Config) -> {"GET / HTTP/1.1\r\nHost: localhost\r\n\r", 408}, {"GET http://localhost/ HTTP/1.1\r\n\r\n", 501}, {"GET / HTTP/1.2\r\nHost: localhost\r\n\r\n", 505}, - {"GET /init_shutdown HTTP/1.1\r\nHost: localhost\r\n\r\n", 666} + {"GET /init_shutdown HTTP/1.1\r\nHost: localhost\r\n\r\n", 666}, + {"GET /long_polling HTTP/1.1\r\nHost: localhost\r\n\r\n", 102} ], [{Packet, StatusCode} = raw_req(Packet, Config) || {Packet, StatusCode} <- Tests]. -- cgit v1.2.3