aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/cowboy_req.erl13
-rw-r--r--test/http_SUITE.erl20
2 files changed, 24 insertions, 9 deletions
diff --git a/src/cowboy_req.erl b/src/cowboy_req.erl
index 27c59cf..fcc9744 100644
--- a/src/cowboy_req.erl
+++ b/src/cowboy_req.erl
@@ -820,7 +820,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 ->
[]
@@ -1134,13 +1136,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;
diff --git a/test/http_SUITE.erl b/test/http_SUITE.erl
index 0417ad0..af3a453 100644
--- a/test/http_SUITE.erl
+++ b/test/http_SUITE.erl
@@ -432,7 +432,10 @@ http10_keepalive_default(Config) ->
ok = raw_send(Client, Normal),
case catch raw_recv_head(Client) of
{'EXIT', _} -> error(closed);
- _ -> ok
+ Data ->
+ {'HTTP/1.0', 200, _, Rest} = cow_http:parse_status_line(Data),
+ {Headers, _} = cow_http:parse_headers(Rest),
+ false = lists:keymember(<<"connection">>, 1, Headers)
end,
ok = raw_send(Client, Normal),
case catch raw_recv_head(Client) of
@@ -446,7 +449,10 @@ http10_keepalive_forced(Config) ->
ok = raw_send(Client, Keepalive),
case catch raw_recv_head(Client) of
{'EXIT', _} -> error(closed);
- _ -> ok
+ Data ->
+ {'HTTP/1.0', 200, _, Rest} = cow_http:parse_status_line(Data),
+ {Headers, _} = cow_http:parse_headers(Rest),
+ {_, <<"keep-alive">>} = lists:keyfind(<<"connection">>, 1, Headers)
end,
ok = raw_send(Client, Keepalive),
case catch raw_recv_head(Client) of
@@ -461,7 +467,7 @@ keepalive_max(Config) ->
CloseRef = gun:get(ConnPid, "/", [{<<"connection">>, <<"keep-alive">>}]),
_ = [begin
{response, nofin, 200, Headers} = gun:await(ConnPid, Ref, MRef),
- {_, <<"keep-alive">>} = lists:keyfind(<<"connection">>, 1, Headers)
+ false = lists:keymember(<<"connection">>, 1, Headers)
end || Ref <- Refs],
{response, nofin, 200, Headers} = gun:await(ConnPid, CloseRef, MRef),
{_, <<"close">>} = lists:keyfind(<<"connection">>, 1, Headers),
@@ -476,7 +482,7 @@ keepalive_nl(Config) ->
end || _ <- lists:seq(1, 10)],
_ = [begin
{response, nofin, 200, Headers} = gun:await(ConnPid, Ref),
- {_, <<"keep-alive">>} = lists:keyfind(<<"connection">>, 1, Headers)
+ false = lists:keymember(<<"connection">>, 1, Headers)
end || Ref <- Refs],
ok.
@@ -730,7 +736,7 @@ rest_keepalive(Config) ->
Refs = [gun:get(ConnPid, "/simple") || _ <- lists:seq(1, 10)],
_ = [begin
{response, nofin, 200, Headers} = gun:await(ConnPid, Ref),
- {_, <<"keep-alive">>} = lists:keyfind(<<"connection">>, 1, Headers)
+ false = lists:keymember(<<"connection">>, 1, Headers)
end || Ref <- Refs],
ok.
@@ -744,9 +750,9 @@ rest_keepalive_post(Config) ->
} || _ <- lists:seq(1, 5)],
_ = [begin
{response, fin, 403, Headers1} = gun:await(ConnPid, Ref1),
- {_, <<"keep-alive">>} = lists:keyfind(<<"connection">>, 1, Headers1),
+ false = lists:keymember(<<"connection">>, 1, Headers1),
{response, fin, 303, Headers2} = gun:await(ConnPid, Ref2),
- {_, <<"keep-alive">>} = lists:keyfind(<<"connection">>, 1, Headers2)
+ false = lists:keymember(<<"connection">>, 1, Headers2)
end || {Ref1, Ref2} <- Refs],
ok.