aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2019-10-03 16:20:29 +0200
committerLoïc Hoguin <[email protected]>2019-10-03 16:20:29 +0200
commit28aee1f2720da122f83758b141c503f7bff18ffb (patch)
tree76dfc7c03cd58726b6e645fff560093bbb0d9e1e
parent1ba48c58b1462fb9d9d8c4d9a43878679aea8eb7 (diff)
downloadcowboy-28aee1f2720da122f83758b141c503f7bff18ffb.tar.gz
cowboy-28aee1f2720da122f83758b141c503f7bff18ffb.tar.bz2
cowboy-28aee1f2720da122f83758b141c503f7bff18ffb.zip
Document media type wildcard in content_types_accepted
-rw-r--r--doc/src/manual/cowboy_rest.asciidoc6
-rw-r--r--src/cowboy_rest.erl2
-rw-r--r--test/handlers/content_types_accepted_h.erl2
-rw-r--r--test/rest_handler_SUITE.erl18
4 files changed, 26 insertions, 2 deletions
diff --git a/doc/src/manual/cowboy_rest.asciidoc b/doc/src/manual/cowboy_rest.asciidoc
index d7901fd..b783a25 100644
--- a/doc/src/manual/cowboy_rest.asciidoc
+++ b/doc/src/manual/cowboy_rest.asciidoc
@@ -184,7 +184,7 @@ content-type header of the response if the media type is text.
----
content_types_accepted(Req, State) -> {Result, Req, State}
-Result :: [{binary() | ParsedMime, AcceptCallback :: atom()}]
+Result :: [{'*' | binary() | ParsedMime, AcceptCallback :: atom()}]
ParsedMime :: {Type :: binary(), SubType :: binary(), '*' | Params}
Params :: [{Key :: binary(), Value :: binary()}]
@@ -200,6 +200,8 @@ A media type is made of different parts. The media type
`text/html;charset=utf-8` is of type `text`, subtype `html`
and has a single parameter `charset` with value `utf-8`.
+The special value `'*'` can be used to accept any media type.
+
// @todo Cowboy needs to ignore the boundary parameter for
// multipart, as we never want to match against it. Or allow
// ignoring specific parameters at the very least.
@@ -724,6 +726,8 @@ listed here, like the authorization header.
== Changelog
+* *2.7*: The media type wildcard in `content_types_accepted`
+ is now documented.
* *2.6*: The callback `rate_limited` was added.
* *2.1*: The `switch_handler` return value was added.
* *1.0*: Behavior introduced.
diff --git a/src/cowboy_rest.erl b/src/cowboy_rest.erl
index 7be3e26..9a73374 100644
--- a/src/cowboy_rest.erl
+++ b/src/cowboy_rest.erl
@@ -61,7 +61,7 @@
-optional_callbacks([charsets_provided/2]).
-callback content_types_accepted(Req, State)
- -> {[{binary() | {binary(), binary(), '*' | [{binary(), binary()}]}, atom()}], Req, State}
+ -> {[{'*' | binary() | {binary(), binary(), '*' | [{binary(), binary()}]}, atom()}], Req, State}
| {stop, Req, State}
| {switch_handler(), Req, State}
when Req::cowboy_req:req(), State::any().
diff --git a/test/handlers/content_types_accepted_h.erl b/test/handlers/content_types_accepted_h.erl
index d34135e..df72f06 100644
--- a/test/handlers/content_types_accepted_h.erl
+++ b/test/handlers/content_types_accepted_h.erl
@@ -21,6 +21,8 @@ content_types_accepted(Req=#{qs := <<"multipart">>}, State) ->
], Req, State};
content_types_accepted(Req=#{qs := <<"param">>}, State) ->
{[{{<<"text">>, <<"plain">>, [{<<"charset">>, <<"utf-8">>}]}, put_text_plain}], Req, State};
+content_types_accepted(Req=#{qs := <<"wildcard">>}, State) ->
+ {[{'*', put_text_plain}], Req, State};
content_types_accepted(Req=#{qs := <<"wildcard-param">>}, State) ->
{[{{<<"text">>, <<"plain">>, '*'}, put_text_plain}], Req, State}.
diff --git a/test/rest_handler_SUITE.erl b/test/rest_handler_SUITE.erl
index cb734d9..43695c3 100644
--- a/test/rest_handler_SUITE.erl
+++ b/test/rest_handler_SUITE.erl
@@ -359,6 +359,24 @@ content_types_accepted_param(Config) ->
{response, fin, 204, _} = gun:await(ConnPid, Ref),
ok.
+content_types_accepted_wildcard(Config) ->
+ doc("When a wildcard is returned from the content_types_accepted "
+ "callback, any content-type must be accepted."),
+ ConnPid = gun_open(Config),
+ Ref1 = gun:put(ConnPid, "/content_types_accepted?wildcard", [
+ {<<"accept-encoding">>, <<"gzip">>},
+ {<<"content-type">>, <<"text/plain">>}
+ ]),
+ gun:data(ConnPid, Ref1, fin, "Hello world!"),
+ {response, fin, 204, _} = gun:await(ConnPid, Ref1),
+ Ref2 = gun:put(ConnPid, "/content_types_accepted?wildcard", [
+ {<<"accept-encoding">>, <<"gzip">>},
+ {<<"content-type">>, <<"application/vnd.plain;charset=UTF-8">>}
+ ]),
+ gun:data(ConnPid, Ref2, fin, "Hello world!"),
+ {response, fin, 204, _} = gun:await(ConnPid, Ref2),
+ ok.
+
content_types_accepted_wildcard_param_no_content_type_param(Config) ->
doc("When a wildcard is returned for parameters from the "
"content_types_accepted callback, a content-type header "