diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/cowboy_http.erl | 82 | ||||
-rw-r--r-- | src/cowboy_http_req.erl | 4 |
2 files changed, 24 insertions, 62 deletions
diff --git a/src/cowboy_http.erl b/src/cowboy_http.erl index e8017f2..a6fec74 100644 --- a/src/cowboy_http.erl +++ b/src/cowboy_http.erl @@ -17,7 +17,7 @@ %% Parsing. -export([list/2, nonempty_list/2, - media_range/2, charset/2, digits/1, + media_range/2, conneg/2, digits/1, token/2, token_ci/2, quoted_string/2]). %% Interpretation. @@ -75,22 +75,13 @@ list(Data, Fun, Acc) -> media_range(Data, Fun) -> token_ci(Data, fun (_Rest, <<>>) -> {error, badarg}; - (Rest, Type) -> whitespace(Rest, - fun (<< $/, Rest2/bits >>) -> whitespace(Rest2, - fun (<<>>) -> {error, badarg}; - (Rest3) -> media_range_subtype(Rest3, Fun, Type) - end); - (_Rest2) -> {error, badarg} + (<< $/, Rest/bits >>, Type) -> token_ci(Rest, + fun (_Rest2, <<>>) -> {error, badarg}; + (Rest2, SubType) -> + media_range_params(Rest2, Fun, Type, SubType, []) end) end). --spec media_range_subtype(binary(), fun(), binary()) -> any(). -media_range_subtype(Data, Fun, Type) -> - token_ci(Data, - fun (_Rest, <<>>) -> {error, badarg}; - (Rest, SubType) -> media_range_params(Rest, Fun, Type, SubType, []) - end). - -spec media_range_params(binary(), fun(), binary(), binary(), [{binary(), binary()}]) -> any(). media_range_params(Data, Fun, Type, SubType, Acc) -> @@ -108,18 +99,8 @@ media_range_params(Data, Fun, Type, SubType, Acc) -> media_range_param_attr(Data, Fun, Type, SubType, Acc) -> token_ci(Data, fun (_Rest, <<>>) -> {error, badarg}; - (Rest, Attr) -> - whitespace(Rest, - fun (<< $=, Rest2/bits >>) -> - whitespace(Rest2, - fun (<<>>) -> {error, badarg}; - (Rest3) -> - media_range_param_value(Rest3, Fun, - Type, SubType, Acc, Attr) - end); - (_Rest2) -> - {error, badarg} - end) + (<< $=, Rest/bits >>, Attr) -> + media_range_param_value(Rest, Fun, Type, SubType, Acc, Attr) end). -spec media_range_param_value(binary(), fun(), binary(), binary(), @@ -166,21 +147,12 @@ accept_ext(Data, Fun, Type, SubType, Params, Quality, Acc) -> accept_ext_attr(Data, Fun, Type, SubType, Params, Quality, Acc) -> token_ci(Data, fun (_Rest, <<>>) -> {error, badarg}; + (<< $=, Rest/bits >>, Attr) -> + accept_ext_value(Rest, Fun, Type, SubType, Params, + Quality, Acc, Attr); (Rest, Attr) -> - whitespace(Rest, - fun (<< $=, Rest2/bits >>) -> - whitespace(Rest2, - fun (<<>>) -> {error, badarg}; - (Rest3) -> - accept_ext_value(Rest3, Fun, - Type, SubType, Params, - Quality, Acc, Attr) - end); - (Rest2) -> - accept_ext(Rest2, Fun, - Type, SubType, Params, - Quality, [Attr|Acc]) - end) + accept_ext(Rest, Fun, Type, SubType, Params, + Quality, [Attr|Acc]) end). -spec accept_ext_value(binary(), fun(), binary(), binary(), @@ -201,41 +173,31 @@ 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) -> +%% @doc Parse a conneg header (Accept-Charset, Accept-Encoding), +%% followed by an optional quality value. +-spec conneg(binary(), fun()) -> any(). +conneg(Data, Fun) -> token_ci(Data, fun (_Rest, <<>>) -> {error, badarg}; - (Rest, Charset) -> + (Rest, Conneg) -> whitespace(Rest, fun (<< $;, Rest2/bits >>) -> whitespace(Rest2, fun (Rest3) -> qparam(Rest3, fun (Rest4, Quality) -> - Fun(Rest4, {Charset, Quality}) + Fun(Rest4, {Conneg, Quality}) end) end); (Rest2) -> - Fun(Rest2, {Charset, 1000}) + Fun(Rest2, {Conneg, 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). +qparam(<< Q, $=, Data/bits >>, Fun) when Q =:= $q; Q =:= $Q -> + qvalue(Data, Fun). %% @doc Skip whitespace. -spec whitespace(binary(), fun()) -> any(). @@ -367,7 +329,7 @@ nonempty_charset_list_test_() -> {<<"unicode-1-1">>, 800} ]} ], - [{V, fun() -> R = nonempty_list(V, fun charset/2) end} || {V, R} <- Tests]. + [{V, fun() -> R = nonempty_list(V, fun conneg/2) end} || {V, R} <- Tests]. nonempty_token_list_test_() -> %% {Value, Result} diff --git a/src/cowboy_http_req.erl b/src/cowboy_http_req.erl index 7a09bcb..911aca1 100644 --- a/src/cowboy_http_req.erl +++ b/src/cowboy_http_req.erl @@ -219,12 +219,12 @@ parse_header(Name, Req, Default) when Name =:= 'Accept' -> parse_header(Name, Req, Default) when Name =:= 'Accept-Charset' -> parse_header(Name, Req, Default, fun (Value) -> - cowboy_http:nonempty_list(Value, fun cowboy_http:charset/2) + cowboy_http:nonempty_list(Value, fun cowboy_http:conneg/2) end); parse_header(Name, Req, Default) when Name =:= 'Accept-Encoding' -> parse_header(Name, Req, Default, fun (Value) -> - cowboy_http:list(Value, fun cowboy_http:token_ci/2) + cowboy_http:list(Value, fun cowboy_http:conneg/2) end); parse_header(Name, Req, Default) when Name =:= 'Connection' -> parse_header(Name, Req, Default, |