diff options
author | Loïc Hoguin <[email protected]> | 2012-03-12 22:57:47 +0100 |
---|---|---|
committer | Loïc Hoguin <[email protected]> | 2012-03-12 22:57:47 +0100 |
commit | 133564d0286fa23787bbe7a660db6f79073bd252 (patch) | |
tree | 421259b97f207b1c2e2c4c09870588bc607343a1 /src | |
parent | 3885912d9b61639437a738707299d2b14d40ed67 (diff) | |
parent | 32a46f898ad999c0a62707807fb02b6805f42ebd (diff) | |
download | cowboy-133564d0286fa23787bbe7a660db6f79073bd252.tar.gz cowboy-133564d0286fa23787bbe7a660db6f79073bd252.tar.bz2 cowboy-133564d0286fa23787bbe7a660db6f79073bd252.zip |
Merge branch 'fix/relax-media-type-parsing' of https://github.com/tillitech/cowboy
Diffstat (limited to 'src')
-rw-r--r-- | src/cowboy_http.erl | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/src/cowboy_http.erl b/src/cowboy_http.erl index 7a3bc7a..9d727f3 100644 --- a/src/cowboy_http.erl +++ b/src/cowboy_http.erl @@ -156,6 +156,13 @@ media_type(Data, Fun) -> fun (_Rest2, <<>>) -> {error, badarg}; (Rest2, SubType) -> Fun(Rest2, Type, SubType) end); + %% This is a non-strict parsing clause required by some user agents + %% that use * instead of */* in the list of media types. + (Rest, <<"*">> = Type) -> + token_ci(<<"*", Rest/binary>>, + fun (_Rest2, <<>>) -> {error, badarg}; + (Rest2, SubType) -> Fun(Rest2, Type, SubType) + end); (_Rest, _Type) -> {error, badarg} end). @@ -676,6 +683,9 @@ quoted_string(<< C, Rest/binary >>, Fun, Acc) -> -spec qvalue(binary(), fun()) -> any(). qvalue(<< $0, $., Rest/binary >>, Fun) -> qvalue(Rest, Fun, 0, 100); +%% Some user agents use q=.x instead of q=0.x +qvalue(<< $., Rest/binary >>, Fun) -> + qvalue(Rest, Fun, 0, 100); qvalue(<< $0, Rest/binary >>, Fun) -> Fun(Rest, 0); qvalue(<< $1, $., $0, $0, $0, Rest/binary >>, Fun) -> @@ -894,6 +904,13 @@ media_range_list_test_() -> [{<<"level">>, <<"1">>}, {<<"quoted">>, <<"hi hi hi">>}]}, 123, [<<"standalone">>, {<<"complex">>, <<"gits">>}]}, {{<<"text">>, <<"plain">>, []}, 1000, []} + ]}, + {<<"text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2">>, [ + {{<<"text">>, <<"html">>, []}, 1000, []}, + {{<<"image">>, <<"gif">>, []}, 1000, []}, + {{<<"image">>, <<"jpeg">>, []}, 1000, []}, + {{<<"*">>, <<"*">>, []}, 200, []}, + {{<<"*">>, <<"*">>, []}, 200, []} ]} ], [{V, fun() -> R = list(V, fun media_range/2) end} || {V, R} <- Tests]. |