diff options
Diffstat (limited to 'src/cowboy_http.erl')
-rw-r--r-- | src/cowboy_http.erl | 50 |
1 files changed, 49 insertions, 1 deletions
diff --git a/src/cowboy_http.erl b/src/cowboy_http.erl index 28346f1..9b8a178 100644 --- a/src/cowboy_http.erl +++ b/src/cowboy_http.erl @@ -17,7 +17,8 @@ %% Parsing. -export([list/2, nonempty_list/2, - media_range/2, token/2, token_ci/2, quoted_string/2]). + media_range/2, charset/2, + token/2, token_ci/2, quoted_string/2]). %% Interpretation. -export([connection_to_atom/1]). @@ -195,6 +196,42 @@ accept_ext_value(Data, Fun, Type, SubType, Params, Quality, Acc, Attr) -> Type, SubType, Params, Quality, [{Attr, Value}|Acc]) end). +%% @doc Parse a charset, followed by an optional quality value. +-spec charset(binary(), fun()) -> any(). +charset(Data, Fun) -> + token_ci(Data, + fun (_Rest, <<>>) -> {error, badarg}; + (Rest, Charset) -> + whitespace(Rest, + fun (<< $;, Rest2/bits >>) -> + whitespace(Rest2, + fun (Rest3) -> + qparam(Rest3, + fun (Rest4, Quality) -> + Fun(Rest4, {Charset, Quality}) + end) + end); + (Rest2) -> + Fun(Rest2, {Charset, 1000}) + end) + end). + +%% Parse a quality parameter string (for example q=0.500). +-spec qparam(binary(), fun()) -> any(). +qparam(<< $q, Rest/bits >>, Fun) -> + whitespace(Rest, + fun (<< $=, Rest2/bits >>) -> + whitespace(Rest2, + fun (Rest3) -> + qvalue(Rest3, + fun (Rest4, Quality) -> + Fun(Rest4, Quality) + end) + end); + (_Rest2) -> + {error, badarg} + end). + %% @doc Skip whitespace. -spec whitespace(binary(), fun()) -> any(). whitespace(<< C, Rest/bits >>, Fun) @@ -293,6 +330,17 @@ connection_to_atom([_Any|Tail]) -> -ifdef(TEST). +nonempty_charset_list_test_() -> + %% {Value, Result} + Tests = [ + {<<>>, {error, badarg}}, + {<<"iso-8859-5, unicode-1-1;q=0.8">>, [ + {<<"iso-8859-5">>, 1000}, + {<<"unicode-1-1">>, 800} + ]} + ], + [{V, fun() -> R = nonempty_list(V, fun charset/2) end} || {V, R} <- Tests]. + nonempty_token_list_test_() -> %% {Value, Result} Tests = [ |