diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/cowboy_handler.erl | 22 | ||||
-rw-r--r-- | src/cowboy_rest.erl | 5 | ||||
-rw-r--r-- | src/cowboy_spdy.erl | 29 | ||||
-rw-r--r-- | src/cowboy_websocket.erl | 5 |
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) -> |