From 5d1d9af6cd2b91df567e482edfac2e1da104e267 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Tue, 3 Jun 2014 18:31:05 +0200 Subject: 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. --- src/cowboy_req.erl | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) (limited to 'src/cowboy_req.erl') diff --git a/src/cowboy_req.erl b/src/cowboy_req.erl index a651515..02089c2 100644 --- a/src/cowboy_req.erl +++ b/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; -- cgit v1.2.3