aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2019-10-05 11:23:57 +0200
committerLoïc Hoguin <[email protected]>2019-10-05 11:23:57 +0200
commit03dac1486d72d9d84a3cb99d2040c78b25853257 (patch)
treefaab2aced8c1abb9152e237bc9c7d60c77850bbc /src
parent5ffb4f98e0a8be09675ca508c269b71654294d6a (diff)
downloadcowboy-03dac1486d72d9d84a3cb99d2040c78b25853257.tar.gz
cowboy-03dac1486d72d9d84a3cb99d2040c78b25853257.tar.bz2
cowboy-03dac1486d72d9d84a3cb99d2040c78b25853257.zip
Add cowboy_req:filter_cookies/2
Diffstat (limited to 'src')
-rw-r--r--src/cowboy_req.erl30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/cowboy_req.erl b/src/cowboy_req.erl
index e5ec4a7..8ae090e 100644
--- a/src/cowboy_req.erl
+++ b/src/cowboy_req.erl
@@ -44,6 +44,7 @@
-export([headers/1]).
-export([parse_header/2]).
-export([parse_header/3]).
+-export([filter_cookies/2]).
-export([parse_cookies/1]).
-export([match_cookies/2]).
@@ -450,6 +451,35 @@ parse_header(Name, Req, Default, ParseFun) ->
Value -> ParseFun(Value)
end.
+-spec filter_cookies([atom() | binary()], Req) -> Req when Req::req().
+filter_cookies(Names0, Req=#{headers := Headers}) ->
+ Names = [if
+ is_atom(N) -> atom_to_binary(N, utf8);
+ true -> N
+ end || N <- Names0],
+ case header(<<"cookie">>, Req) of
+ undefined -> Req;
+ Value0 ->
+ Cookies0 = binary:split(Value0, <<$;>>),
+ Cookies = lists:filter(fun(Cookie) ->
+ lists:member(cookie_name(Cookie), Names)
+ end, Cookies0),
+ Value = iolist_to_binary(lists:join($;, Cookies)),
+ Req#{headers => Headers#{<<"cookie">> => Value}}
+ end.
+
+%% This is a specialized function to extract a cookie name
+%% regardless of whether the name is valid or not. We skip
+%% whitespace at the beginning and take whatever's left to
+%% be the cookie name, up to the = sign.
+cookie_name(<<$\s, Rest/binary>>) -> cookie_name(Rest);
+cookie_name(<<$\t, Rest/binary>>) -> cookie_name(Rest);
+cookie_name(Name) -> cookie_name(Name, <<>>).
+
+cookie_name(<<>>, Name) -> Name;
+cookie_name(<<$=, _/bits>>, Name) -> Name;
+cookie_name(<<C, Rest/bits>>, Acc) -> cookie_name(Rest, <<Acc/binary, C>>).
+
-spec parse_cookies(req()) -> [{binary(), binary()}].
parse_cookies(Req) ->
parse_header(<<"cookie">>, Req).