Browse Source

Merge pull request #46 from tillitech/master

Fix the handling of HEAD requests
Loïc Hoguin 13 years ago
parent
commit
55ba8dc4da
1 changed files with 15 additions and 2 deletions
  1. 15 2
      src/cowboy_http_req.erl

+ 15 - 2
src/cowboy_http_req.erl

@@ -264,7 +264,7 @@ body_qs(Req) ->
 	-> {ok, #http_req{}}.
 reply(Code, Headers, Body, Req=#http_req{socket=Socket,
 		transport=Transport, connection=Connection,
-		resp_state=waiting}) ->
+		method=Method, resp_state=waiting}) ->
 	Head = response_head(Code, Headers, [
 		{<<"Connection">>, atom_to_connection(Connection)},
 		{<<"Content-Length">>,
@@ -272,7 +272,10 @@ reply(Code, Headers, Body, Req=#http_req{socket=Socket,
 		{<<"Date">>, cowboy_clock:rfc1123()},
 		{<<"Server">>, <<"Cowboy">>}
 	]),
-	Transport:send(Socket, [Head, Body]),
+	case Method of
+		'HEAD' -> Transport:send(Socket, Head);
+		_ -> Transport:send(Socket, [Head, Body])
+	end,
 	{ok, Req#http_req{resp_state=done}}.
 
 %% @doc Initiate the sending of a chunked reply to the client.
@@ -280,6 +283,14 @@ reply(Code, Headers, Body, Req=#http_req{socket=Socket,
 -spec chunked_reply(http_status(), http_headers(), #http_req{})
 	-> {ok, #http_req{}}.
 chunked_reply(Code, Headers, Req=#http_req{socket=Socket, transport=Transport,
+		method='HEAD', resp_state=waiting}) ->
+	Head = response_head(Code, Headers, [
+		{<<"Date">>, cowboy_clock:rfc1123()},
+		{<<"Server">>, <<"Cowboy">>}
+	]),
+	Transport:send(Socket, Head),
+	{ok, Req#http_req{resp_state=done}};
+chunked_reply(Code, Headers, Req=#http_req{socket=Socket, transport=Transport,
 		resp_state=waiting}) ->
 	Head = response_head(Code, Headers, [
 		{<<"Connection">>, <<"close">>},
@@ -294,6 +305,8 @@ chunked_reply(Code, Headers, Req=#http_req{socket=Socket, transport=Transport,
 %%
 %% A chunked reply must have been initiated before calling this function.
 -spec chunk(iodata(), #http_req{}) -> ok.
+chunk(_Data, #http_req{socket=_Socket, transport=_Transport, method='HEAD'}) ->
+	ok;
 chunk(Data, #http_req{socket=Socket, transport=Transport, resp_state=chunks}) ->
 	Transport:send(Socket, [integer_to_list(iolist_size(Data), 16),
 		<<"\r\n">>, Data, <<"\r\n">>]).