Browse Source

Add a return value to onresponse hook to override status/headers

This would allow us to override them without messing up the body,
and would make it usable with the static file handler for example.

Experimental at this point.
Loïc Hoguin 11 years ago
parent
commit
5d1d9af6cd
1 changed files with 16 additions and 11 deletions
  1. 16 11
      src/cowboy_req.erl

+ 16 - 11
src/cowboy_req.erl

@@ -1205,30 +1205,35 @@ response(Status, Headers, RespHeaders, DefaultHeaders, Body, Req=#http_req{
 		_ -> response_merge_headers(Headers, RespHeaders, DefaultHeaders)
 	end,
 	Body2 = case Body of stream -> <<>>; _ -> Body end,
-	Req2 = case OnResponse of
-		already_called -> Req;
-		undefined -> Req;
+	{Status2, FullHeaders2, Req2} = case OnResponse of
+		already_called -> {Status, FullHeaders, Req};
+		undefined -> {Status, FullHeaders, Req};
 		OnResponse ->
-			OnResponse(Status, FullHeaders, Body2,
-				%% Don't call 'onresponse' from the hook itself.
-				Req#http_req{resp_headers=[], resp_body= <<>>,
-					onresponse=already_called})
+			case OnResponse(Status, FullHeaders, Body2,
+					%% Don't call 'onresponse' from the hook itself.
+					Req#http_req{resp_headers=[], resp_body= <<>>,
+						onresponse=already_called}) of
+				StHdReq = {_, _, _} ->
+					StHdReq;
+				Req1 ->
+					{Status, FullHeaders, Req1}
+			end
 	end,
 	ReplyType = case Req2#http_req.resp_state of
 		waiting when Transport =:= cowboy_spdy, Body =:= stream ->
-			cowboy_spdy:stream_reply(Socket, status(Status), FullHeaders),
+			cowboy_spdy:stream_reply(Socket, status(Status2), FullHeaders2),
 			ReqPid ! {?MODULE, resp_sent},
 			normal;
 		waiting when Transport =:= cowboy_spdy ->
-			cowboy_spdy:reply(Socket, status(Status), FullHeaders, Body),
+			cowboy_spdy:reply(Socket, status(Status2), FullHeaders2, Body),
 			ReqPid ! {?MODULE, resp_sent},
 			normal;
 		RespState when RespState =:= waiting; RespState =:= waiting_stream ->
 			HTTPVer = atom_to_binary(Version, latin1),
 			StatusLine = << HTTPVer/binary, " ",
-				(status(Status))/binary, "\r\n" >>,
+				(status(Status2))/binary, "\r\n" >>,
 			HeaderLines = [[Key, <<": ">>, Value, <<"\r\n">>]
-				|| {Key, Value} <- FullHeaders],
+				|| {Key, Value} <- FullHeaders2],
 			Transport:send(Socket, [StatusLine, HeaderLines, <<"\r\n">>, Body2]),
 			ReqPid ! {?MODULE, resp_sent},
 			normal;