aboutsummaryrefslogtreecommitdiffstats
path: root/src/cow_hpack.erl
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2016-05-24 15:31:14 +0200
committerLoïc Hoguin <[email protected]>2016-05-24 15:31:14 +0200
commit41949ddaf1889cebf51b00fc1c78961ffa2c1c52 (patch)
tree4e5950b64e23559b0403acf627b8aec307e6b5c7 /src/cow_hpack.erl
parentb5d5d674b160433f9ddf18e5b034cceb8f2bdab4 (diff)
downloadcowlib-41949ddaf1889cebf51b00fc1c78961ffa2c1c52.tar.gz
cowlib-41949ddaf1889cebf51b00fc1c78961ffa2c1c52.tar.bz2
cowlib-41949ddaf1889cebf51b00fc1c78961ffa2c1c52.zip
HPACK: Fix an issue with header values as iolists
Diffstat (limited to 'src/cow_hpack.erl')
-rw-r--r--src/cow_hpack.erl19
1 files changed, 16 insertions, 3 deletions
diff --git a/src/cow_hpack.erl b/src/cow_hpack.erl
index efabaa6..738dd20 100644
--- a/src/cow_hpack.erl
+++ b/src/cow_hpack.erl
@@ -563,7 +563,9 @@ encode(Headers, State, Opts) ->
%% @todo Handle cases where no/never indexing is expected.
encode([], State, _, Acc) ->
{lists:reverse(Acc), State};
-encode([Header = {Name, Value}|Tail], State, Opts, Acc) ->
+encode([Header0 = {Name, Value0}|Tail], State, Opts, Acc) ->
+ Value = iolist_to_binary(Value0),
+ Header = {Name, Value},
case table_find(Header, State) of
%% Indexed header field representation.
{field, Index} ->
@@ -974,13 +976,24 @@ resp_encode_test() ->
{52,{<<"content-encoding">>, <<"gzip">>}},
{65,{<<"date">>, <<"Mon, 21 Oct 2013 20:13:22 GMT">>}}]} = State3,
ok.
+
+encode_iolist_test() ->
+ Headers = [
+ {<<":method">>, <<"GET">>},
+ {<<":scheme">>, <<"http">>},
+ {<<":path">>, <<"/">>},
+ {<<":authority">>, <<"www.example.com">>},
+ {<<"content-type">>, [<<"image">>,<<"/">>,<<"png">>,<<>>]}
+ ],
+ {_, _} = encode(Headers),
+ ok.
-endif.
%% Static and dynamic tables.
%% @todo There must be a more efficient way.
-table_find({Name, Value}, State) ->
- case table_find_field({Name, iolist_to_binary(Value)}, State) of
+table_find(Header = {Name, _}, State) ->
+ case table_find_field(Header, State) of
not_found ->
case table_find_name(Name, State) of
NotFound = not_found ->