0
Fork 0
mirror of https://github.com/ninenines/cowboy.git synced 2025-07-15 20:50:24 +00:00

Better handle socket closing with loop handlers

We now read from the socket to be able to detect errors or TCP close
events, and buffer the data if any. Once the data receive goes over
a certain limit, which defaults to 5000 bytes, we simply close the
connection with an {error, overflow} reason.
This commit is contained in:
Loïc Hoguin 2013-02-11 09:03:13 +01:00
parent 65ed13d2da
commit 40b8d0befc
4 changed files with 84 additions and 17 deletions

View file

@ -49,6 +49,7 @@
-export([onresponse_crash/1]).
-export([onresponse_reply/1]).
-export([pipeline/1]).
-export([pipeline_long_polling/1]).
-export([rest_bad_accept/1]).
-export([rest_created_path/1]).
-export([rest_expires/1]).
@ -112,6 +113,7 @@ groups() ->
nc_rand,
nc_zero,
pipeline,
pipeline_long_polling,
rest_bad_accept,
rest_created_path,
rest_expires,
@ -432,6 +434,8 @@ The document has moved
<A HREF=\"http://www.google.co.il/\">here</A>.
</BODY></HTML>",
Tests = [
{102, <<"GET /long_polling HTTP/1.1\r\nHost: localhost\r\n"
"Content-Length: 5000\r\n\r\n", 0:5000/unit:8 >>},
{200, ["GET / HTTP/1.0\r\nHost: localhost\r\n"
"Set-Cookie: ", HugeCookie, "\r\n\r\n"]},
{200, "\r\n\r\n\r\n\r\n\r\nGET / HTTP/1.1\r\nHost: localhost\r\n\r\n"},
@ -449,6 +453,8 @@ The document has moved
{408, "GET / HTTP/1.1\r\nHost: localhost\r\n\r"},
{414, Huge},
{400, "GET / HTTP/1.1\r\n" ++ Huge},
{500, <<"GET /long_polling HTTP/1.1\r\nHost: localhost\r\n"
"Content-Length: 100000\r\n\r\n", 0:100000/unit:8 >>},
{505, "GET / HTTP/1.2\r\nHost: localhost\r\n\r\n"},
{closed, ""},
{closed, "\r\n"},
@ -758,6 +764,16 @@ pipeline(Config) ->
{ok, 200, _, Client11} = cowboy_client:response(Client10),
{error, closed} = cowboy_client:response(Client11).
pipeline_long_polling(Config) ->
Client = ?config(client, Config),
{ok, Client2} = cowboy_client:request(<<"GET">>,
build_url("/long_polling", Config), Client),
{ok, Client3} = cowboy_client:request(<<"GET">>,
build_url("/long_polling", Config), Client2),
{ok, 102, _, Client4} = cowboy_client:response(Client3),
{ok, 102, _, Client5} = cowboy_client:response(Client4),
{error, closed} = cowboy_client:response(Client5).
rest_bad_accept(Config) ->
Client = ?config(client, Config),
{ok, Client2} = cowboy_client:request(<<"GET">>,

View file

@ -19,4 +19,6 @@ info(timeout, Req, State) ->
{loop, Req, State - 1, hibernate}.
terminate({normal, shutdown}, _, _) ->
ok;
terminate({error, overflow}, _, _) ->
ok.