diff options
author | Loïc Hoguin <[email protected]> | 2013-04-26 13:45:47 +0200 |
---|---|---|
committer | Loïc Hoguin <[email protected]> | 2013-04-26 13:45:47 +0200 |
commit | e73780975c3082381ac71ef119776b0678776d26 (patch) | |
tree | 2f203ca8829f06c10ab608e273390eee87edf101 | |
parent | 61b3157ad14ae49da3ac6b33643a876eb18bbf2a (diff) | |
parent | 72a9ccacdd5fead8f9c45a8a38327382be8534d8 (diff) | |
download | cowboy-e73780975c3082381ac71ef119776b0678776d26.tar.gz cowboy-e73780975c3082381ac71ef119776b0678776d26.tar.bz2 cowboy-e73780975c3082381ac71ef119776b0678776d26.zip |
Merge branch 'pr-381-fix' of git://github.com/seletskiy/cowboy
-rw-r--r-- | src/cowboy_rest.erl | 20 | ||||
-rw-r--r-- | test/http_SUITE.erl | 12 | ||||
-rw-r--r-- | test/rest_postonly_resource.erl | 14 |
3 files changed, 42 insertions, 4 deletions
diff --git a/src/cowboy_rest.erl b/src/cowboy_rest.erl index c28b627..4ba2b47 100644 --- a/src/cowboy_rest.erl +++ b/src/cowboy_rest.erl @@ -219,13 +219,25 @@ options(Req, State) -> content_types_provided(Req, State) -> case call(Req, State, content_types_provided) of no_call -> - not_acceptable(Req, State); + State2 = State#state{ + content_types_p=[{{<<"text">>, <<"html">>, '*'}, to_html}]}, + case cowboy_req:parse_header(<<"accept">>, Req) of + {error, badarg} -> + respond(Req, State2, 400); + {ok, undefined, Req2} -> + languages_provided( + cowboy_req:set_meta(media_type, {<<"text">>, <<"html">>, []}, Req2), + State2#state{content_type_a={{<<"text">>, <<"html">>, []}, to_html}}); + {ok, Accept, Req2} -> + Accept2 = prioritize_accept(Accept), + choose_media_type(Req2, State2, Accept2) + end; {halt, Req2, HandlerState} -> terminate(Req2, State#state{handler_state=HandlerState}); {[], Req2, HandlerState} -> not_acceptable(Req2, State#state{handler_state=HandlerState}); {CTP, Req2, HandlerState} -> - CTP2 = [normalize_content_types(P) || P <- CTP], + CTP2 = [normalize_content_types(P) || P <- CTP], State2 = State#state{ handler_state=HandlerState, content_types_p=CTP2}, case cowboy_req:parse_header(<<"accept">>, Req2) of @@ -244,7 +256,7 @@ content_types_provided(Req, State) -> normalize_content_types({ContentType, Callback}) when is_binary(ContentType) -> - {cowboy_http:content_type(ContentType), Callback}; + {cowboy_http:content_type(ContentType), Callback}; normalize_content_types(Normalized) -> Normalized. @@ -779,7 +791,7 @@ accept_resource(Req, State) -> {halt, Req2, HandlerState} -> terminate(Req2, State#state{handler_state=HandlerState}); {CTA, Req2, HandlerState} -> - CTA2 = [normalize_content_types(P) || P <- CTA], + CTA2 = [normalize_content_types(P) || P <- CTA], State2 = State#state{handler_state=HandlerState}, case cowboy_req:parse_header(<<"content-type">>, Req2) of {ok, ContentType, Req3} -> diff --git a/test/http_SUITE.erl b/test/http_SUITE.erl index 5cc63f1..168503c 100644 --- a/test/http_SUITE.erl +++ b/test/http_SUITE.erl @@ -64,6 +64,7 @@ -export([rest_options_default/1]). -export([rest_param_all/1]). -export([rest_patch/1]). +-export([rest_postonly/1]). -export([rest_resource_etags/1]). -export([rest_resource_etags_if_none_match/1]). -export([set_env_dispatch/1]). @@ -135,6 +136,7 @@ groups() -> rest_options_default, rest_param_all, rest_patch, + rest_postonly, rest_resource_etags, rest_resource_etags_if_none_match, set_resp_body, @@ -366,6 +368,7 @@ init_dispatch(Config) -> {"/missing_get_callbacks", rest_missing_callbacks, []}, {"/missing_put_callbacks", rest_missing_callbacks, []}, {"/nodelete", rest_nodelete_resource, []}, + {"/postonly", rest_postonly_resource, []}, {"/patch", rest_patch_resource, []}, {"/resetags", rest_resource_etags, []}, {"/rest_expires", rest_expires, []}, @@ -992,6 +995,15 @@ rest_patch(Config) -> ok end || {Status, Headers, Body} <- Tests]. +rest_postonly(Config) -> + Client = ?config(client, Config), + Headers = [ + {<<"content-type">>, <<"text/plain">>} + ], + {ok, Client2} = cowboy_client:request(<<"POST">>, + build_url("/postonly", Config), Headers, "12345", Client), + {ok, 204, _, _} = cowboy_client:response(Client2). + rest_resource_get_etag(Config, Type) -> rest_resource_get_etag(Config, Type, []). diff --git a/test/rest_postonly_resource.erl b/test/rest_postonly_resource.erl new file mode 100644 index 0000000..4f725c9 --- /dev/null +++ b/test/rest_postonly_resource.erl @@ -0,0 +1,14 @@ +-module(rest_postonly_resource). +-export([init/3, allowed_methods/2, content_types_accepted/2, from_text/2]). + +init(_Transport, _Req, _Opts) -> + {upgrade, protocol, cowboy_rest}. + +allowed_methods(Req, State) -> + {[<<"POST">>], Req, State}. + +content_types_accepted(Req, State) -> + {[{{<<"text">>, <<"plain">>, '*'}, from_text}], Req, State}. + +from_text(Req, State) -> + {true, Req, State}. |