0
Fork 0
mirror of https://github.com/ninenines/cowboy.git synced 2025-07-15 12:40:25 +00:00

Add {halt, Req, State} return value to most REST callbacks

Excluding generate_etag, last_modified, expires and variances.
This commit is contained in:
Loïc Hoguin 2012-01-23 08:24:15 +01:00
parent 0761ef67a1
commit dee19f11c3

View file

@ -89,6 +89,8 @@ known_methods(Req=#http_req{method=Method}, State) ->
next(Req, State, fun uri_too_long/2); next(Req, State, fun uri_too_long/2);
no_call -> no_call ->
next(Req, State, 501); next(Req, State, 501);
{halt, Req2, HandlerState} ->
terminate(Req2, State#state{handler_state=HandlerState});
{List, Req2, HandlerState} -> {List, Req2, HandlerState} ->
State2 = State#state{handler_state=HandlerState}, State2 = State#state{handler_state=HandlerState},
case lists:member(Method, List) of case lists:member(Method, List) of
@ -107,6 +109,8 @@ allowed_methods(Req=#http_req{method=Method}, State) ->
next(Req, State, fun malformed_request/2); next(Req, State, fun malformed_request/2);
no_call -> no_call ->
method_not_allowed(Req, State, ['GET', 'HEAD']); method_not_allowed(Req, State, ['GET', 'HEAD']);
{halt, Req2, HandlerState} ->
terminate(Req2, State#state{handler_state=HandlerState});
{List, Req2, HandlerState} -> {List, Req2, HandlerState} ->
State2 = State#state{handler_state=HandlerState}, State2 = State#state{handler_state=HandlerState},
case lists:member(Method, List) of case lists:member(Method, List) of
@ -138,6 +142,8 @@ is_authorized(Req, State) ->
case call(Req, State, is_authorized) of case call(Req, State, is_authorized) of
no_call -> no_call ->
forbidden(Req, State); forbidden(Req, State);
{halt, Req2, HandlerState} ->
terminate(Req2, State#state{handler_state=HandlerState});
{true, Req2, HandlerState} -> {true, Req2, HandlerState} ->
forbidden(Req2, State#state{handler_state=HandlerState}); forbidden(Req2, State#state{handler_state=HandlerState});
{{false, AuthHead}, Req2, HandlerState} -> {{false, AuthHead}, Req2, HandlerState} ->
@ -163,8 +169,12 @@ valid_entity_length(Req, State) ->
%% If you need to add additional headers to the response at this point, %% If you need to add additional headers to the response at this point,
%% you should do it directly in the options/2 call using set_resp_headers. %% you should do it directly in the options/2 call using set_resp_headers.
options(Req=#http_req{method='OPTIONS'}, State) -> options(Req=#http_req{method='OPTIONS'}, State) ->
{ok, Req2, HandlerState} = call(Req, State, options), case call(Req, State, options) of
respond(Req2, State#state{handler_state=HandlerState}, 200); {halt, Req2, HandlerState} ->
terminate(Req2, State#state{handler_state=HandlerState});
{ok, Req2, HandlerState} ->
respond(Req2, State#state{handler_state=HandlerState}, 200)
end;
options(Req, State) -> options(Req, State) ->
content_types_provided(Req, State). content_types_provided(Req, State).
@ -187,6 +197,8 @@ content_types_provided(Req=#http_req{meta=Meta}, State) ->
case call(Req, State, content_types_provided) of case call(Req, State, content_types_provided) of
no_call -> no_call ->
not_acceptable(Req, State); not_acceptable(Req, State);
{halt, Req2, HandlerState} ->
terminate(Req2, State#state{handler_state=HandlerState});
{[], Req2, HandlerState} -> {[], Req2, HandlerState} ->
not_acceptable(Req2, State#state{handler_state=HandlerState}); not_acceptable(Req2, State#state{handler_state=HandlerState});
{CTP, Req2, HandlerState} -> {CTP, Req2, HandlerState} ->
@ -281,6 +293,8 @@ languages_provided(Req, State) ->
case call(Req, State, languages_provided) of case call(Req, State, languages_provided) of
no_call -> no_call ->
charsets_provided(Req, State); charsets_provided(Req, State);
{halt, Req2, HandlerState} ->
terminate(Req2, State#state{handler_state=HandlerState});
{[], Req2, HandlerState} -> {[], Req2, HandlerState} ->
not_acceptable(Req2, State#state{handler_state=HandlerState}); not_acceptable(Req2, State#state{handler_state=HandlerState});
{LP, Req2, HandlerState} -> {LP, Req2, HandlerState} ->
@ -342,6 +356,8 @@ charsets_provided(Req, State) ->
case call(Req, State, charsets_provided) of case call(Req, State, charsets_provided) of
no_call -> no_call ->
set_content_type(Req, State); set_content_type(Req, State);
{halt, Req2, HandlerState} ->
terminate(Req2, State#state{handler_state=HandlerState});
{[], Req2, HandlerState} -> {[], Req2, HandlerState} ->
not_acceptable(Req2, State#state{handler_state=HandlerState}); not_acceptable(Req2, State#state{handler_state=HandlerState});
{CP, Req2, HandlerState} -> {CP, Req2, HandlerState} ->
@ -586,6 +602,8 @@ moved_permanently(Req, State, OnFalse) ->
respond(Req3, State#state{handler_state=HandlerState}, 301); respond(Req3, State#state{handler_state=HandlerState}, 301);
{false, Req2, HandlerState} -> {false, Req2, HandlerState} ->
OnFalse(Req2, State#state{handler_state=HandlerState}); OnFalse(Req2, State#state{handler_state=HandlerState});
{halt, Req2, HandlerState} ->
terminate(Req2, State#state{handler_state=HandlerState});
no_call -> no_call ->
OnFalse(Req, State) OnFalse(Req, State)
end. end.
@ -605,6 +623,8 @@ moved_temporarily(Req, State) ->
respond(Req3, State#state{handler_state=HandlerState}, 307); respond(Req3, State#state{handler_state=HandlerState}, 307);
{false, Req2, HandlerState} -> {false, Req2, HandlerState} ->
is_post_to_missing_resource(Req2, State#state{handler_state=HandlerState}, 410); is_post_to_missing_resource(Req2, State#state{handler_state=HandlerState}, 410);
{halt, Req2, HandlerState} ->
terminate(Req2, State#state{handler_state=HandlerState});
no_call -> no_call ->
is_post_to_missing_resource(Req, State, 410) is_post_to_missing_resource(Req, State, 410)
end. end.
@ -643,6 +663,8 @@ post_is_create(Req, State) ->
%% (including the leading /). %% (including the leading /).
create_path(Req=#http_req{meta=Meta}, State) -> create_path(Req=#http_req{meta=Meta}, State) ->
case call(Req, State, create_path) of case call(Req, State, create_path) of
{halt, Req2, HandlerState} ->
terminate(Req2, State#state{handler_state=HandlerState});
{Path, Req2, HandlerState} -> {Path, Req2, HandlerState} ->
Location = create_path_location(Req2, Path), Location = create_path_location(Req2, Path),
State2 = State#state{handler_state=HandlerState}, State2 = State#state{handler_state=HandlerState},
@ -673,6 +695,8 @@ create_path_location_port(_, Port) ->
%% and false when it hasn't, in which case a 500 error is sent. %% and false when it hasn't, in which case a 500 error is sent.
process_post(Req, State) -> process_post(Req, State) ->
case call(Req, State, process_post) of case call(Req, State, process_post) of
{halt, Req2, HandlerState} ->
terminate(Req2, State#state{handler_state=HandlerState});
{true, Req2, HandlerState} -> {true, Req2, HandlerState} ->
State2 = State#state{handler_state=HandlerState}, State2 = State#state{handler_state=HandlerState},
next(Req2, State2, 201); next(Req2, State2, 201);
@ -700,6 +724,8 @@ put_resource(Req, State, OnTrue) ->
case call(Req, State, content_types_accepted) of case call(Req, State, content_types_accepted) of
no_call -> no_call ->
respond(Req, State, 415); respond(Req, State, 415);
{halt, Req2, HandlerState} ->
terminate(Req2, State#state{handler_state=HandlerState});
{CTA, Req2, HandlerState} -> {CTA, Req2, HandlerState} ->
State2 = State#state{handler_state=HandlerState}, State2 = State#state{handler_state=HandlerState},
{ContentType, Req3} {ContentType, Req3}
@ -712,6 +738,8 @@ choose_content_type(Req, State, _OnTrue, _ContentType, []) ->
choose_content_type(Req, State, OnTrue, ContentType, choose_content_type(Req, State, OnTrue, ContentType,
[{Accepted, Fun}|_Tail]) when ContentType =:= Accepted -> [{Accepted, Fun}|_Tail]) when ContentType =:= Accepted ->
case call(Req, State, Fun) of case call(Req, State, Fun) of
{halt, Req2, HandlerState} ->
terminate(Req2, State#state{handler_state=HandlerState});
{true, Req2, HandlerState} -> {true, Req2, HandlerState} ->
State2 = State#state{handler_state=HandlerState}, State2 = State#state{handler_state=HandlerState},
next(Req2, State2, OnTrue); next(Req2, State2, OnTrue);
@ -755,6 +783,8 @@ set_resp_body(Req=#http_req{method=Method},
end, end,
{Req5, State4} = set_resp_expires(Req4, State3), {Req5, State4} = set_resp_expires(Req4, State3),
case call(Req5, State4, Fun) of case call(Req5, State4, Fun) of
{halt, Req6, HandlerState} ->
terminate(Req6, State4#state{handler_state=HandlerState});
{Body, Req6, HandlerState} -> {Body, Req6, HandlerState} ->
State5 = State4#state{handler_state=HandlerState}, State5 = State4#state{handler_state=HandlerState},
{ok, Req7} = case Body of {ok, Req7} = case Body of
@ -842,6 +872,8 @@ expect(Req, State, Callback, Expected, OnTrue, OnFalse) ->
case call(Req, State, Callback) of case call(Req, State, Callback) of
no_call -> no_call ->
next(Req, State, OnTrue); next(Req, State, OnTrue);
{halt, Req2, HandlerState} ->
terminate(Req2, State#state{handler_state=HandlerState});
{Expected, Req2, HandlerState} -> {Expected, Req2, HandlerState} ->
next(Req2, State#state{handler_state=HandlerState}, OnTrue); next(Req2, State#state{handler_state=HandlerState}, OnTrue);
{_Unexpected, Req2, HandlerState} -> {_Unexpected, Req2, HandlerState} ->