From 05509c6c4b75ff38d9e4bd87eca0616883983a25 Mon Sep 17 00:00:00 2001 From: geeksilva97 Date: Tue, 6 Feb 2024 18:23:58 -0300 Subject: [PATCH 1/6] nothing interesting yet --- src/cowboy_req.erl | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/cowboy_req.erl b/src/cowboy_req.erl index 3f8767772..17bec5e62 100644 --- a/src/cowboy_req.erl +++ b/src/cowboy_req.erl @@ -726,6 +726,10 @@ set_resp_header(Name, Value, Req=#{resp_headers := RespHeaders}) -> set_resp_header(Name,Value, Req) -> Req#{resp_headers => #{Name => Value}}. +-spec set_resp_headers_list(list(term()), req()) +set_resp_headers_list(List, Req) -> + ok. + -spec set_resp_headers(cowboy:http_headers(), Req) -> Req when Req::req(). set_resp_headers(#{<<"set-cookie">> := _}, _) -> From c6491b82a8234b61ee6c4f1c3ed7c4ecdc8a916e Mon Sep 17 00:00:00 2001 From: geeksilva97 Date: Tue, 26 Mar 2024 01:05:16 -0300 Subject: [PATCH 2/6] add clause for processing given headers --- src/cowboy_req.erl | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/cowboy_req.erl b/src/cowboy_req.erl index 17bec5e62..68efc9f48 100644 --- a/src/cowboy_req.erl +++ b/src/cowboy_req.erl @@ -726,9 +726,14 @@ set_resp_header(Name, Value, Req=#{resp_headers := RespHeaders}) -> set_resp_header(Name,Value, Req) -> Req#{resp_headers => #{Name => Value}}. +% @todo process headers list - reduce to a map and concat the values of repeated headers, except for set-cookie that will be treated differently +% @todo define the correct spec -spec set_resp_headers_list(list(term()), req()) -set_resp_headers_list(List, Req) -> - ok. +set_resp_headers_list([], Req) -> + Req; +set_resp_headers_list([{Name, Value} | Headers], Req) -> + Req1 = set_resp_header(Name, Value, Req), + set_resp_headers_list(Headers, Req1). -spec set_resp_headers(cowboy:http_headers(), Req) -> Req when Req::req(). From 9af49cd4cd6c2935528c23b2b2ac9dd5f1642f21 Mon Sep 17 00:00:00 2001 From: geeksilva97 Date: Fri, 19 Apr 2024 06:44:10 -0300 Subject: [PATCH 3/6] add base bitstring concat --- .tool-versions | 1 + src/cowboy_req.erl | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 .tool-versions diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 000000000..09d38677d --- /dev/null +++ b/.tool-versions @@ -0,0 +1 @@ +erlang 26.2.2 diff --git a/src/cowboy_req.erl b/src/cowboy_req.erl index 68efc9f48..da9579c41 100644 --- a/src/cowboy_req.erl +++ b/src/cowboy_req.erl @@ -729,11 +729,21 @@ set_resp_header(Name,Value, Req) -> % @todo process headers list - reduce to a map and concat the values of repeated headers, except for set-cookie that will be treated differently % @todo define the correct spec -spec set_resp_headers_list(list(term()), req()) -set_resp_headers_list([], Req) -> +set_resp_headers_list(HeaderTupleList, Req) -> + set_resp_headers_list(HeaderTupleList, #{}, Req). + +set_resp_headers_list([], Map, Req) -> + % @todo merge Map with Req headers Req; -set_resp_headers_list([{Name, Value} | Headers], Req) -> - Req1 = set_resp_header(Name, Value, Req), - set_resp_headers_list(Headers, Req1). +set_resp_headers_list([{Name, Value} | Headers], Map, Req) -> + NewHeaderValue = case maps:get(Name, Map, undefined) of + undefined -> Value, + ExistingValue -> <> + end, + + Map1 = maps:put(Name, NewHeaderValue, Map), + + set_resp_headers_list(Headers, Map1, Req1). -spec set_resp_headers(cowboy:http_headers(), Req) -> Req when Req::req(). From d43807d19b84f6f60f84ecdcda7333f3a1f987ec Mon Sep 17 00:00:00 2001 From: geeksilva97 Date: Fri, 19 Apr 2024 09:23:36 -0300 Subject: [PATCH 4/6] add minor tests --- src/cowboy_req.erl | 38 +++++++++++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/src/cowboy_req.erl b/src/cowboy_req.erl index da9579c41..b87991cb3 100644 --- a/src/cowboy_req.erl +++ b/src/cowboy_req.erl @@ -68,6 +68,7 @@ -export([resp_headers/1]). -export([set_resp_header/3]). -export([set_resp_headers/2]). +-export([set_resp_headers_list/2]). -export([has_resp_header/2]). -export([delete_resp_header/2]). -export([set_resp_body/2]). @@ -366,6 +367,26 @@ uri2_test() -> <<"http://localhost/path?dummy=2785">> = iolist_to_binary(uri(Req, #{port => 80})), <<"https://localhost/path?dummy=2785">> = iolist_to_binary(uri(Req, #{scheme => "https", port => 443})), ok. + +resp_headers_test() -> + Req = #{ + scheme => <<"http">>, host => <<"localhost">>, port => 8080, + path => <<"/path">>, qs => <<"dummy=2785">> + }, + #{resp_headers := RespHeaders} = set_resp_headers_list([ + {<<"Name">>, <<"Cormano">>}, + {<<"Name">>, <<"Paco">>}, + {<<"X-MyHeader">>, <<"custom-header">>}, + {<<"api-key">>, "My api"}, + {<<"api-key">>, "KEY"} + ], #{}, Req), + + #{ + <<"Name">> := <<"Cormano, Paco">>, + <<"X-MyHeader">> := <<"custom-header">> + } = RespHeaders, + + ok. -endif. -spec binding(atom(), req()) -> any() | undefined. @@ -726,24 +747,27 @@ set_resp_header(Name, Value, Req=#{resp_headers := RespHeaders}) -> set_resp_header(Name,Value, Req) -> Req#{resp_headers => #{Name => Value}}. -% @todo process headers list - reduce to a map and concat the values of repeated headers, except for set-cookie that will be treated differently -% @todo define the correct spec --spec set_resp_headers_list(list(term()), req()) +% @todo make it work with iodata(), for now only bitstrings are accepted + +-spec set_resp_headers_list(list({ binary(), iodata() }), Req) + -> Req when Req::req(). set_resp_headers_list(HeaderTupleList, Req) -> set_resp_headers_list(HeaderTupleList, #{}, Req). set_resp_headers_list([], Map, Req) -> - % @todo merge Map with Req headers - Req; + set_resp_headers(Map, Req); + +set_resp_headers_list([{<<"set-cookie">>, Value} | Headers], Map, Req) -> + set_resp_headers_list(Headers, Map, Req); set_resp_headers_list([{Name, Value} | Headers], Map, Req) -> NewHeaderValue = case maps:get(Name, Map, undefined) of - undefined -> Value, + undefined -> Value; ExistingValue -> <> end, Map1 = maps:put(Name, NewHeaderValue, Map), - set_resp_headers_list(Headers, Map1, Req1). + set_resp_headers_list(Headers, Map1, Req). -spec set_resp_headers(cowboy:http_headers(), Req) -> Req when Req::req(). From ded96a1df4ee3388b433b53592a725eae89492d5 Mon Sep 17 00:00:00 2001 From: geeksilva97 Date: Fri, 19 Apr 2024 10:35:14 -0300 Subject: [PATCH 5/6] handle iodata --- src/cowboy_req.erl | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/cowboy_req.erl b/src/cowboy_req.erl index b87991cb3..456207eb9 100644 --- a/src/cowboy_req.erl +++ b/src/cowboy_req.erl @@ -377,13 +377,17 @@ resp_headers_test() -> {<<"Name">>, <<"Cormano">>}, {<<"Name">>, <<"Paco">>}, {<<"X-MyHeader">>, <<"custom-header">>}, - {<<"api-key">>, "My api"}, - {<<"api-key">>, "KEY"} + {<<"game-name">>, "Sunset"}, + {<<"game-name">>, "Riders"}, + {<<"header">>, ["io", "data"]}, + {<<"header">>, ["header"]} ], #{}, Req), #{ <<"Name">> := <<"Cormano, Paco">>, - <<"X-MyHeader">> := <<"custom-header">> + <<"X-MyHeader">> := <<"custom-header">>, + <<"game-name">> := <<"Sunset, Riders">>, + <<"header">> := <<"iodata, header">> } = RespHeaders, ok. @@ -757,12 +761,14 @@ set_resp_headers_list(HeaderTupleList, Req) -> set_resp_headers_list([], Map, Req) -> set_resp_headers(Map, Req); -set_resp_headers_list([{<<"set-cookie">>, Value} | Headers], Map, Req) -> +set_resp_headers_list([{<<"set-cookie">>, _} | Headers], Map, Req) -> set_resp_headers_list(Headers, Map, Req); set_resp_headers_list([{Name, Value} | Headers], Map, Req) -> + BinaryValue = iolist_to_binary(Value), NewHeaderValue = case maps:get(Name, Map, undefined) of - undefined -> Value; - ExistingValue -> <> + undefined -> BinaryValue; + ExistingValue -> + <> end, Map1 = maps:put(Name, NewHeaderValue, Map), From c6df5dd9d13763d5a3f77a8d1b4b45b791584fb8 Mon Sep 17 00:00:00 2001 From: geeksilva97 Date: Fri, 19 Apr 2024 10:37:13 -0300 Subject: [PATCH 6/6] remove unused files --- .tool-versions | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .tool-versions diff --git a/.tool-versions b/.tool-versions deleted file mode 100644 index 09d38677d..000000000 --- a/.tool-versions +++ /dev/null @@ -1 +0,0 @@ -erlang 26.2.2