aboutsummaryrefslogtreecommitdiffstats
path: root/src/cowboy_protocol.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/cowboy_protocol.erl')
-rw-r--r--src/cowboy_protocol.erl38
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.