diff options
Diffstat (limited to 'src/cowboy_protocol.erl')
-rw-r--r-- | src/cowboy_protocol.erl | 38 |
1 files changed, 22 insertions, 16 deletions
diff --git a/src/cowboy_protocol.erl b/src/cowboy_protocol.erl index c5ea561..7ab66a9 100644 --- a/src/cowboy_protocol.erl +++ b/src/cowboy_protocol.erl @@ -379,7 +379,9 @@ request(B, State=#state{transport=Transport}, M, P, Q, F, Version, Headers) -> request(B, State, M, P, Q, F, Version, Headers, <<>>, default_port(Transport:name())); {_, RawHost} -> - case parse_host(RawHost, <<>>) of + case catch parse_host(RawHost, <<>>) of + {'EXIT', _} -> + error_terminate(400, State); {Host, undefined} -> request(B, State, M, P, Q, F, Version, Headers, Host, default_port(Transport:name())); @@ -440,19 +442,19 @@ request(Buffer, State=#state{socket=Socket, transport=Transport, Req = cowboy_req:new(Socket, Transport, Method, Path, Query, Fragment, Version, Headers, Host, Port, Buffer, ReqKeepalive < MaxKeepalive, OnResponse), - onrequest(Req, State, Host, Path). + onrequest(Req, State, Host). %% Call the global onrequest callback. The callback can send a reply, %% in which case we consider the request handled and move on to the next %% one. Note that since we haven't dispatched yet, we don't know the %% handler, host_info, path_info or bindings yet. --spec onrequest(cowboy_req:req(), #state{}, binary(), binary()) -> ok. -onrequest(Req, State=#state{onrequest=undefined}, Host, Path) -> - dispatch(Req, State, Host, Path); -onrequest(Req, State=#state{onrequest=OnRequest}, Host, Path) -> +-spec onrequest(cowboy_req:req(), #state{}, binary()) -> ok. +onrequest(Req, State=#state{onrequest=undefined}, Host) -> + dispatch(Req, State, Host, cowboy_req:get(path, Req)); +onrequest(Req, State=#state{onrequest=OnRequest}, Host) -> Req2 = OnRequest(Req), case cowboy_req:get(resp_state, Req2) of - waiting -> dispatch(Req2, State, Host, Path); + waiting -> dispatch(Req2, State, Host, cowboy_req:get(path, Req2)); _ -> next_request(Req2, State, ok) end. @@ -464,6 +466,8 @@ dispatch(Req, State=#state{dispatch=Dispatch}, Host, Path) -> handler_init(Req2, State, Handler, Opts); {error, notfound, host} -> error_terminate(400, State); + {error, badrequest, path} -> + error_terminate(400, State); {error, notfound, path} -> error_terminate(404, State) end. @@ -489,16 +493,18 @@ handler_init(Req, State=#state{transport=Transport}, Handler, Opts) -> handler_terminate(Req2, Handler, HandlerState); %% @todo {upgrade, transport, Module} {upgrade, protocol, Module} -> - upgrade_protocol(Req, State, Handler, Opts, Module) + upgrade_protocol(Req, State, Handler, Opts, Module); + {upgrade, protocol, Module, Req2, Opts2} -> + upgrade_protocol(Req2, State, Handler, Opts2, Module) catch Class:Reason -> error_terminate(500, State), error_logger:error_msg( - "** Handler ~p terminating in init/3~n" + "** Cowboy handler ~p terminating in ~p/~p~n" " for the reason ~p:~p~n" "** Options were ~p~n" "** Request was ~p~n" "** Stacktrace: ~p~n~n", - [Handler, Class, Reason, Opts, + [Handler, init, 3, Class, Reason, Opts, cowboy_req:to_list(Req), erlang:get_stacktrace()]) end. @@ -518,12 +524,12 @@ handler_handle(Req, State, Handler, HandlerState) -> terminate_request(Req2, State, Handler, HandlerState2) catch Class:Reason -> error_logger:error_msg( - "** Handler ~p terminating in handle/2~n" + "** Cowboy handler ~p terminating in ~p/~p~n" " for the reason ~p:~p~n" "** Handler state was ~p~n" "** Request was ~p~n" "** Stacktrace: ~p~n~n", - [Handler, Class, Reason, HandlerState, + [Handler, handle, 2, Class, Reason, HandlerState, cowboy_req:to_list(Req), erlang:get_stacktrace()]), handler_terminate(Req, Handler, HandlerState), error_terminate(500, State) @@ -576,12 +582,12 @@ handler_call(Req, State, Handler, HandlerState, Message) -> Handler, HandlerState2) catch Class:Reason -> error_logger:error_msg( - "** Handler ~p terminating in info/3~n" + "** Cowboy handler ~p terminating in ~p/~p~n" " for the reason ~p:~p~n" "** Handler state was ~p~n" "** Request was ~p~n" "** Stacktrace: ~p~n~n", - [Handler, Class, Reason, HandlerState, + [Handler, info, 3, Class, Reason, HandlerState, cowboy_req:to_list(Req), erlang:get_stacktrace()]), handler_terminate(Req, Handler, HandlerState), error_terminate(500, State) @@ -593,12 +599,12 @@ handler_terminate(Req, Handler, HandlerState) -> Handler:terminate(cowboy_req:lock(Req), HandlerState) catch Class:Reason -> error_logger:error_msg( - "** Handler ~p terminating in terminate/2~n" + "** Cowboy handler ~p terminating in ~p/~p~n" " for the reason ~p:~p~n" "** Handler state was ~p~n" "** Request was ~p~n" "** Stacktrace: ~p~n~n", - [Handler, Class, Reason, HandlerState, + [Handler, terminate, 2, Class, Reason, HandlerState, cowboy_req:to_list(Req), erlang:get_stacktrace()]) end. |