aboutsummaryrefslogtreecommitdiffstats
path: root/src/cowboy_http.erl
diff options
context:
space:
mode:
authorAli Sabil <[email protected]>2013-04-15 18:36:33 +0200
committerAli Sabil <[email protected]>2013-06-20 13:09:13 +0200
commita63faff35efc0b7a42678e3834be3f9453fb0eda (patch)
treee1e74e3557bc84a223b2ea36296a0eeaf45c6a6c /src/cowboy_http.erl
parent47396211cf855b786b9059e86dd535162cc7f1ba (diff)
downloadcowboy-a63faff35efc0b7a42678e3834be3f9453fb0eda.tar.gz
cowboy-a63faff35efc0b7a42678e3834be3f9453fb0eda.tar.bz2
cowboy-a63faff35efc0b7a42678e3834be3f9453fb0eda.zip
Add support for the webkit deflate frame extension
Diffstat (limited to 'src/cowboy_http.erl')
-rw-r--r--src/cowboy_http.erl55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/cowboy_http.erl b/src/cowboy_http.erl
index d2bdf3b..7e20615 100644
--- a/src/cowboy_http.erl
+++ b/src/cowboy_http.erl
@@ -38,6 +38,7 @@
-export([quoted_string/2]).
-export([authorization/2]).
-export([range/1]).
+-export([parameterized_tokens/1]).
%% Decoding.
-export([te_chunked/2]).
@@ -905,6 +906,49 @@ range_digits(Data, Default, Fun) ->
Fun(Data, Default)
end).
+%% @doc Parse a non empty list of tokens followed with optional parameters.
+-spec parameterized_tokens(binary()) -> any().
+parameterized_tokens(Data) ->
+ nonempty_list(Data,
+ fun (D, Fun) ->
+ token(D,
+ fun (_Rest, <<>>) -> {error, badarg};
+ (Rest, Token) ->
+ parameterized_tokens_params(Rest,
+ fun (Rest2, Params) ->
+ Fun(Rest2, {Token, Params})
+ end, [])
+ end)
+ end).
+
+-spec parameterized_tokens_params(binary(), fun(), [binary() | {binary(), binary()}]) -> any().
+parameterized_tokens_params(Data, Fun, Acc) ->
+ whitespace(Data,
+ fun (<< $;, Rest/binary >>) ->
+ parameterized_tokens_param(Rest,
+ fun (Rest2, Param) ->
+ parameterized_tokens_params(Rest2, Fun, [Param|Acc])
+ end);
+ (Rest) ->
+ Fun(Rest, lists:reverse(Acc))
+ end).
+
+-spec parameterized_tokens_param(binary(), fun()) -> any().
+parameterized_tokens_param(Data, Fun) ->
+ whitespace(Data,
+ fun (Rest) ->
+ token(Rest,
+ fun (_Rest2, <<>>) -> {error, badarg};
+ (<< $=, Rest2/binary >>, Attr) ->
+ word(Rest2,
+ fun (Rest3, Value) ->
+ Fun(Rest3, {Attr, Value})
+ end);
+ (Rest2, Attr) ->
+ Fun(Rest2, Attr)
+ end)
+ end).
+
%% Decoding.
%% @doc Decode a stream of chunks.
@@ -1290,6 +1334,17 @@ content_type_test_() ->
],
[{V, fun () -> R = content_type(V) end} || {V, R} <- Tests].
+parameterized_tokens_test_() ->
+ %% {ParameterizedTokens, Result}
+ Tests = [
+ {<<"foo">>, [{<<"foo">>, []}]},
+ {<<"bar; baz=2">>, [{<<"bar">>, [{<<"baz">>, <<"2">>}]}]},
+ {<<"bar; baz=2;bat">>, [{<<"bar">>, [{<<"baz">>, <<"2">>}, <<"bat">>]}]},
+ {<<"bar; baz=2;bat=\"z=1,2;3\"">>, [{<<"bar">>, [{<<"baz">>, <<"2">>}, {<<"bat">>, <<"z=1,2;3">>}]}]},
+ {<<"foo, bar; baz=2">>, [{<<"foo">>, []}, {<<"bar">>, [{<<"baz">>, <<"2">>}]}]}
+ ],
+ [{V, fun () -> R = parameterized_tokens(V) end} || {V, R} <- Tests].
+
digits_test_() ->
%% {Digits, Result}
Tests = [