diff options
author | Fred Hebert <[email protected]> | 2014-01-14 13:30:58 -0500 |
---|---|---|
committer | Fred Hebert <[email protected]> | 2014-07-14 10:11:03 -0400 |
commit | b10b34a8f204ed409a6fc936e199557bfe3b0975 (patch) | |
tree | d911ecf2b32464ef67a12f02dec809300686dc42 | |
parent | 9980348a1cd74a41b3024f0b01d6fef301d8288b (diff) | |
download | cowboy-b10b34a8f204ed409a6fc936e199557bfe3b0975.tar.gz cowboy-b10b34a8f204ed409a6fc936e199557bfe3b0975.tar.bz2 cowboy-b10b34a8f204ed409a6fc936e199557bfe3b0975.zip |
Support ad-hoc keep-alive for HTTP/1.0 Clients
Only go for keep-alive if they submit a 'connection: keep-alive' header
in the request, keep behaviour the same otherwise.
The new RFC 7230 (http://tools.ietf.org/html/rfc7230#section-6.3)
states:
If the received protocol is HTTP/1.0, the "keep-alive" connection
option is present, the recipient is not a proxy, and the recipient
wishes to honor the HTTP/1.0 "keep-alive" mechanism, the
connection will persist after the current response;
Even though clients are discouraged from doing so in Appendix A.1.2
(http://tools.ietf.org/html/rfc7230#appendix-A.1.2)
-rw-r--r-- | src/cowboy_req.erl | 7 | ||||
-rw-r--r-- | test/http_SUITE.erl | 28 |
2 files changed, 33 insertions, 2 deletions
diff --git a/src/cowboy_req.erl b/src/cowboy_req.erl index 1394e72..981b321 100644 --- a/src/cowboy_req.erl +++ b/src/cowboy_req.erl @@ -174,13 +174,16 @@ new(Socket, Transport, Peer, Method, Path, Query, method=Method, path=Path, qs=Query, version=Version, headers=Headers, host=Host, port=Port, buffer=Buffer, resp_compress=Compress, onresponse=OnResponse}, - case CanKeepalive and (Version =:= 'HTTP/1.1') of + case CanKeepalive of false -> Req#http_req{connection=close}; true -> case lists:keyfind(<<"connection">>, 1, Headers) of false -> - Req; %% keepalive + case Version of + 'HTTP/1.1' -> Req; %% keepalive + 'HTTP/1.0' -> Req#http_req{connection=close} + end; {_, ConnectionHeader} -> Tokens = cow_http_hd:parse_connection(ConnectionHeader), Connection = connection_to_atom(Tokens), diff --git a/test/http_SUITE.erl b/test/http_SUITE.erl index e5a9256..0417ad0 100644 --- a/test/http_SUITE.erl +++ b/test/http_SUITE.erl @@ -426,6 +426,34 @@ http10_hostless(Config) -> [{port, Port10}|Config]), cowboy:stop_listener(http10_hostless). +http10_keepalive_default(Config) -> + Normal = "GET / HTTP/1.0\r\nhost: localhost\r\n\r\n", + Client = raw_open(Config), + ok = raw_send(Client, Normal), + case catch raw_recv_head(Client) of + {'EXIT', _} -> error(closed); + _ -> ok + end, + ok = raw_send(Client, Normal), + case catch raw_recv_head(Client) of + {'EXIT', _} -> closed; + _ -> error(not_closed) + end. + +http10_keepalive_forced(Config) -> + Keepalive = "GET / HTTP/1.0\r\nhost: localhost\r\nConnection: keep-alive\r\n\r\n", + Client = raw_open(Config), + ok = raw_send(Client, Keepalive), + case catch raw_recv_head(Client) of + {'EXIT', _} -> error(closed); + _ -> ok + end, + ok = raw_send(Client, Keepalive), + case catch raw_recv_head(Client) of + {'EXIT', Err} -> error({closed, Err}); + _ -> ok + end. + keepalive_max(Config) -> {ConnPid, MRef} = gun_monitor_open(Config), Refs = [gun:get(ConnPid, "/", [{<<"connection">>, <<"keep-alive">>}]) |