aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cowboy_handler.erl22
-rw-r--r--src/cowboy_rest.erl5
-rw-r--r--src/cowboy_spdy.erl29
-rw-r--r--src/cowboy_websocket.erl5
4 files changed, 27 insertions, 34 deletions
diff --git a/src/cowboy_handler.erl b/src/cowboy_handler.erl
index 7780e20..263c659 100644
--- a/src/cowboy_handler.erl
+++ b/src/cowboy_handler.erl
@@ -44,8 +44,7 @@
}).
-spec execute(Req, Env)
- -> {ok, Req, Env} | {error, 500, Req}
- | {suspend, ?MODULE, handler_loop, [any()]}
+ -> {ok, Req, Env} | {suspend, ?MODULE, handler_loop, [any()]}
when Req::cowboy_req:req(), Env::cowboy_middleware:env().
execute(Req, Env) ->
{_, Handler} = lists:keyfind(handler, 1, Env),
@@ -58,8 +57,7 @@ execute(Req, Env) ->
Handler, HandlerOpts).
-spec handler_init(Req, #state{}, module(), any())
- -> {ok, Req, cowboy_middleware:env()}
- | {error, 500, Req} | {suspend, module(), atom(), [any()]}
+ -> {ok, Req, cowboy_middleware:env()} | {suspend, module(), atom(), [any()]}
when Req::cowboy_req:req().
handler_init(Req, State, Handler, HandlerOpts) ->
Transport = cowboy_req:get(transport, Req),
@@ -108,9 +106,7 @@ upgrade_protocol(Req, #state{env=Env},
Module:upgrade(Req, Env, Handler, HandlerOpts).
-spec handler_handle(Req, #state{}, module(), any())
- -> {ok, Req, cowboy_middleware:env()}
- | {error, 500, Req}
- when Req::cowboy_req:req().
+ -> {ok, Req, cowboy_middleware:env()} when Req::cowboy_req:req().
handler_handle(Req, State, Handler, HandlerState) ->
try Handler:handle(Req, HandlerState) of
{ok, Req2, HandlerState2} ->
@@ -130,8 +126,7 @@ handler_handle(Req, State, Handler, HandlerState) ->
%% Update the state if the response was sent in the callback.
-spec handler_after_callback(Req, #state{}, module(), any())
- -> {ok, Req, cowboy_middleware:env()}
- | {error, 500, Req} | {suspend, module(), atom(), [any()]}
+ -> {ok, Req, cowboy_middleware:env()} | {suspend, module(), atom(), [any()]}
when Req::cowboy_req:req().
handler_after_callback(Req, State=#state{resp_sent=false}, Handler,
HandlerState) ->
@@ -146,8 +141,7 @@ handler_after_callback(Req, State, Handler, HandlerState) ->
handler_before_loop(Req, State, Handler, HandlerState).
-spec handler_before_loop(Req, #state{}, module(), any())
- -> {ok, Req, cowboy_middleware:env()}
- | {error, 500, Req} | {suspend, module(), atom(), [any()]}
+ -> {ok, Req, cowboy_middleware:env()} | {suspend, module(), atom(), [any()]}
when Req::cowboy_req:req().
handler_before_loop(Req, State=#state{hibernate=true}, Handler, HandlerState) ->
[Socket, Transport] = cowboy_req:get([socket, transport], Req),
@@ -173,8 +167,7 @@ handler_loop_timeout(State=#state{loop_timeout=Timeout,
State#state{loop_timeout_ref=TRef}.
-spec handler_loop(Req, #state{}, module(), any())
- -> {ok, Req, cowboy_middleware:env()}
- | {error, 500, Req} | {suspend, module(), atom(), [any()]}
+ -> {ok, Req, cowboy_middleware:env()} | {suspend, module(), atom(), [any()]}
when Req::cowboy_req:req().
handler_loop(Req, State=#state{loop_buffer_size=NbBytes,
loop_max_buffer=Threshold, loop_timeout_ref=TRef},
@@ -222,8 +215,7 @@ handler_loop(Req, State=#state{loop_buffer_size=NbBytes,
end.
-spec handler_call(Req, #state{}, module(), any(), any())
- -> {ok, Req, cowboy_middleware:env()}
- | {error, 500, Req} | {suspend, module(), atom(), [any()]}
+ -> {ok, Req, cowboy_middleware:env()} | {suspend, module(), atom(), [any()]}
when Req::cowboy_req:req().
handler_call(Req, State=#state{resp_sent=RespSent},
Handler, HandlerState, Message) ->
diff --git a/src/cowboy_rest.erl b/src/cowboy_rest.erl
index 5741dfe..fd1588a 100644
--- a/src/cowboy_rest.erl
+++ b/src/cowboy_rest.erl
@@ -56,8 +56,7 @@
}).
-spec upgrade(Req, Env, module(), any())
- -> {ok, Req, Env} | {error, 500, Req}
- when Req::cowboy_req:req(), Env::cowboy_middleware:env().
+ -> {ok, Req, Env} when Req::cowboy_req:req(), Env::cowboy_middleware:env().
upgrade(Req, Env, Handler, HandlerOpts) ->
Method = cowboy_req:get(method, Req),
case erlang:function_exported(Handler, rest_init, 2) of
@@ -781,7 +780,7 @@ process_content_type(Req, State=#state{method=Method, exists=Exists}, Fun) ->
next(Req2, State2, fun maybe_created/2);
{false, Req2, HandlerState2} ->
State2 = State#state{handler_state=HandlerState2},
- respond(Req2, State2, 422);
+ respond(Req2, State2, 400);
{{true, ResURL}, Req2, HandlerState2} when Method =:= <<"POST">> ->
State2 = State#state{handler_state=HandlerState2},
Req3 = cowboy_req:set_resp_header(
diff --git a/src/cowboy_spdy.erl b/src/cowboy_spdy.erl
index ca834ef..faea142 100644
--- a/src/cowboy_spdy.erl
+++ b/src/cowboy_spdy.erl
@@ -106,24 +106,13 @@ init(Parent, Ref, Socket, Transport, Opts) ->
middlewares=Middlewares, env=Env, onrequest=OnRequest,
onresponse=OnResponse, peer=Peer, zdef=Zdef, zinf=Zinf}).
-parse_frame(State=#state{zinf=Zinf}, Data) ->
- case cow_spdy:split(Data) of
- {true, Frame, Rest} ->
- P = cow_spdy:parse(Frame, Zinf),
- State2 = handle_frame(State#state{buffer = Rest}, P),
- parse_frame(State2, Rest);
- false ->
- loop(State#state{buffer=Data})
- end.
-
loop(State=#state{parent=Parent, socket=Socket, transport=Transport,
buffer=Buffer, children=Children}) ->
{OK, Closed, Error} = Transport:messages(),
Transport:setopts(Socket, [{active, once}]),
receive
{OK, Socket, Data} ->
- Data2 = << Buffer/binary, Data/binary >>,
- parse_frame(State, Data2);
+ parse_frame(State, << Buffer/binary, Data/binary >>);
{Closed, Socket} ->
terminate(State);
{Error, Socket, _Reason} ->
@@ -239,6 +228,20 @@ system_terminate(Reason, _, _, _) ->
system_code_change(Misc, _, _, _) ->
{ok, Misc}.
+parse_frame(State=#state{zinf=Zinf}, Data) ->
+ case cow_spdy:split(Data) of
+ {true, Frame, Rest} ->
+ P = cow_spdy:parse(Frame, Zinf),
+ case handle_frame(State#state{buffer = Rest}, P) of
+ error ->
+ terminate(State);
+ State2 ->
+ parse_frame(State2, Rest)
+ end;
+ false ->
+ loop(State#state{buffer=Data})
+ end.
+
%% FLAG_UNIDIRECTIONAL can only be set by the server.
handle_frame(State, {syn_stream, StreamID, _, _, true,
_, _, _, _, _, _, _}) ->
@@ -304,7 +307,7 @@ handle_frame(State, {data, StreamID, IsFin, Data}) ->
%% General error, can't recover.
handle_frame(State, {error, badprotocol}) ->
goaway(State, protocol_error),
- terminate(State);
+ error;
%% Ignore all other frames for now.
handle_frame(State, Frame) ->
error_logger:error_msg("Ignored frame ~p", [Frame]),
diff --git a/src/cowboy_websocket.erl b/src/cowboy_websocket.erl
index 98e25e6..6c41137 100644
--- a/src/cowboy_websocket.erl
+++ b/src/cowboy_websocket.erl
@@ -58,7 +58,7 @@
}).
-spec upgrade(Req, Env, module(), any())
- -> {ok, Req, Env} | {error, 400, Req}
+ -> {ok, Req, Env}
| {suspend, module(), atom(), [any()]}
when Req::cowboy_req:req(), Env::cowboy_middleware:env().
upgrade(Req, Env, Handler, HandlerOpts) ->
@@ -124,8 +124,7 @@ websocket_extensions(State, Req) ->
end.
-spec handler_init(#state{}, Req, any())
- -> {ok, Req, cowboy_middleware:env()} | {error, 400, Req}
- | {suspend, module(), atom(), [any()]}
+ -> {ok, Req, cowboy_middleware:env()} | {suspend, module(), atom(), [any()]}
when Req::cowboy_req:req().
handler_init(State=#state{env=Env, transport=Transport,
handler=Handler}, Req, HandlerOpts) ->