aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
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).