diff options
author | Alexey Lebedeff <[email protected]> | 2015-07-28 23:20:51 +0300 |
---|---|---|
committer | Loïc Hoguin <[email protected]> | 2015-08-07 12:48:07 +0200 |
commit | b290b88a67204f8ba5be94dda759f0cc2baa18be (patch) | |
tree | ddbb3c97bd182b61cf3c3ab38cf74eb04bb2ec0a /src/cowboy_req.erl | |
parent | e25634cd9db82a4760087a2ba68d4c6a76353d66 (diff) | |
download | cowboy-b290b88a67204f8ba5be94dda759f0cc2baa18be.tar.gz cowboy-b290b88a67204f8ba5be94dda759f0cc2baa18be.tar.bz2 cowboy-b290b88a67204f8ba5be94dda759f0cc2baa18be.zip |
Use 'Connection' header only when necessary
Fixes #839 when 'Connection: Keep-Alive' wasn't sent in a HTTP/1.0
response. Now the usage of 'Connection' header is consistent with
current protocol version: when this header is not specified explicitly
in the response, HTTP/1.0 implies 'Connection: close' and HTTP/1.1
implies 'Connection: Keep-Alive'. So if current 'Connection' value
matches the default value of current protocol, we won't state obvious
fact in the response; and vice versa.
Amended to fix and improve tests, and revert the variable name
change from HTTP11Headers to StdHeaders. I think it's still good
to leave it as is because it's not really a standard header for
HTTP/1.0, and it's gone from HTTP/2 entirely.
Diffstat (limited to 'src/cowboy_req.erl')
-rw-r--r-- | src/cowboy_req.erl | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/src/cowboy_req.erl b/src/cowboy_req.erl index b13da50..8f0a04b 100644 --- a/src/cowboy_req.erl +++ b/src/cowboy_req.erl @@ -686,7 +686,9 @@ reply(Status, Headers, Body, Req=#http_req{ resp_state=RespState, resp_headers=RespHeaders}) when RespState =:= waiting; RespState =:= waiting_stream -> HTTP11Headers = if - Transport =/= cowboy_spdy, Version =:= 'HTTP/1.1' -> + Transport =/= cowboy_spdy, Version =:= 'HTTP/1.0', Connection =:= keepalive -> + [{<<"connection">>, atom_to_connection(Connection)}]; + Transport =/= cowboy_spdy, Version =:= 'HTTP/1.1', Connection =:= close -> [{<<"connection">>, atom_to_connection(Connection)}]; true -> [] @@ -988,13 +990,20 @@ chunked_response(Status, Headers, Req=#http_req{ when RespState =:= waiting; RespState =:= waiting_stream -> RespConn = response_connection(Headers, Connection), HTTP11Headers = if + Version =:= 'HTTP/1.0', Connection =:= keepalive -> + [{<<"connection">>, atom_to_connection(Connection)}]; Version =:= 'HTTP/1.0' -> []; true -> MaybeTE = if RespState =:= waiting_stream -> []; true -> [{<<"transfer-encoding">>, <<"chunked">>}] end, - [{<<"connection">>, atom_to_connection(Connection)}|MaybeTE] + if + Connection =:= close -> + [{<<"connection">>, atom_to_connection(Connection)}|MaybeTE]; + true -> + MaybeTE + end end, RespState2 = if Version =:= 'HTTP/1.1', RespState =:= 'waiting' -> chunks; |