aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/cowboy_rest.erl14
-rw-r--r--test/http_SUITE.erl12
-rw-r--r--test/rest_postonly_resource.erl14
3 files changed, 39 insertions, 1 deletions
diff --git a/src/cowboy_rest.erl b/src/cowboy_rest.erl
index c28b627..9757b85 100644
--- a/src/cowboy_rest.erl
+++ b/src/cowboy_rest.erl
@@ -219,7 +219,19 @@ 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} ->
diff --git a/test/http_SUITE.erl b/test/http_SUITE.erl
index 4a01856..c9a357e 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}.