0
Fork 0
mirror of https://github.com/ninenines/cowboy.git synced 2025-07-15 12:40:25 +00:00

Fix a bug where dupe headers were sent in cowboy_http_req:reply/4.

Now the server defines default headers that can be overwritten by the
handler simply by passing them to the reply/4 function. Default headers
include, for now, Connection and Content-Length headers. Note that it isn't
enough to change the Connection header to close a keep-alive connection
server-side.
This commit is contained in:
Loïc Hoguin 2011-04-14 01:26:02 +02:00
parent 4048499af2
commit c32db277c8
3 changed files with 34 additions and 12 deletions

View file

@ -174,15 +174,18 @@ body_qs(Req) ->
-spec reply(Code::http_status(), Headers::http_headers(),
Body::iolist(), Req::#http_req{}) -> {ok, Req::#http_req{}}.
%% @todo Don't be naive about the headers!
reply(Code, Headers, Body, Req=#http_req{socket=Socket,
transport=Transport, connection=Connection,
resp_state=waiting}) ->
StatusLine = ["HTTP/1.1 ", status(Code), "\r\n"],
BaseHeaders = ["Connection: ", atom_to_connection(Connection),
"\r\nContent-Length: ", integer_to_list(iolist_size(Body)), "\r\n"],
Transport:send(Socket,
[StatusLine, BaseHeaders, Headers, "\r\n", Body]),
DefaultHeaders = [
{"Connection", atom_to_connection(Connection)},
{"Content-Length", integer_to_list(iolist_size(Body))}
],
Headers2 = lists:keysort(1, Headers),
Headers3 = lists:ukeymerge(1, Headers2, DefaultHeaders),
Headers4 = [[Key, ": ", Value, "\r\n"] || {Key, Value} <- Headers3],
Transport:send(Socket, [StatusLine, Headers4, "\r\n", Body]),
{ok, Req#http_req{resp_state=done}}.
%% Internal.