Browse Source

Separate building the response head from replying.

Loïc Hoguin 14 years ago
parent
commit
18582a7a39
1 changed files with 14 additions and 9 deletions
  1. 14 9
      src/cowboy_http_req.erl

+ 14 - 9
src/cowboy_http_req.erl

@@ -184,18 +184,12 @@ body_qs(Req) ->
 reply(Code, Headers, Body, Req=#http_req{socket=Socket,
 		transport=Transport, connection=Connection,
 		resp_state=waiting}) ->
-	StatusLine = <<"HTTP/1.1 ", (status(Code))/binary, "\r\n">>,
-	DefaultHeaders = [
+	Head = response_head(Code, Headers, [
 		{<<"Connection">>, atom_to_connection(Connection)},
 		{<<"Content-Length">>,
 			list_to_binary(integer_to_list(iolist_size(Body)))}
-	],
-	Headers2 = [{header_to_binary(Key), Value} || {Key, Value} <- Headers],
-	Headers3 = lists:keysort(1, Headers2),
-	Headers4 = lists:ukeymerge(1, Headers3, DefaultHeaders),
-	Headers5 = [<< Key/binary, ": ", Value/binary, "\r\n" >>
-		|| {Key, Value} <- Headers4],
-	Transport:send(Socket, [StatusLine, Headers5, <<"\r\n">>, Body]),
+	]),
+	Transport:send(Socket, [Head, Body]),
 	{ok, Req#http_req{resp_state=done}}.
 
 %% Internal.
@@ -210,6 +204,17 @@ parse_qs(Qs) ->
 		[Name, Value] -> {Name, Value}
 	end || Token <- Tokens].
 
+-spec response_head(Code::http_status(), Headers::http_headers(),
+	DefaultHeaders::http_headers()) -> iolist().
+response_head(Code, Headers, DefaultHeaders) ->
+	StatusLine = <<"HTTP/1.1 ", (status(Code))/binary, "\r\n">>,
+	Headers2 = [{header_to_binary(Key), Value} || {Key, Value} <- Headers],
+	Headers3 = lists:keysort(1, Headers2),
+	Headers4 = lists:ukeymerge(1, Headers3, DefaultHeaders),
+	Headers5 = [<< Key/binary, ": ", Value/binary, "\r\n" >>
+		|| {Key, Value} <- Headers4],
+	[StatusLine, Headers5, <<"\r\n">>].
+
 -spec atom_to_connection(Atom::keepalive | close) -> binary().
 atom_to_connection(keepalive) ->
 	<<"keep-alive">>;