Erlang Web 框架 cowboy BUG 一枚
为熟悉 Erlang ,手头有个 Web 项目就用 Erlang 在写,用的 cowboy<https://github.com/extend/cowboy> 框架
在处理 Cookie 的时候发现一个问题:同时写多个 Cookie ,后一个会把前一个覆盖,只会留下一个
{ok, Req2} = cowboy_http_req:set_resp_cookie(<<"uid">>, Uid, [{path, "/"}], Req), {ok, Req3} = cowboy_http_req:set_resp_cookie(<<"session_id">>, SessionID, [{path, "/"}], Req2),
执行这个之后,在浏览器里查看 Cookie,只有 session_id 而没有 uid
这种小众的东西文档不全,社区几乎没有,不过还好 Google 了半天,在 https://github.com/extend/cowboy/pull/199 找到了解决方案
源码的 merge_headers 有 Bug ,以下是源码
-spec merge_headers(cowboy_http:headers(), cowboy_http:headers()) -> cowboy_http:headers(). merge_headers(Headers, []) -> Headers; merge_headers(Headers, [{Name, Value}|Tail]) -> Headers2 = case lists:keymember(Name, 1, Headers) of true -> Headers; false -> Headers ++ [{Name, Value}] end, merge_headers(Headers2, Tail).
改成以下代码后正常
-spec merge_headers(cowboy_http:headers(), cowboy_http:headers()) -> cowboy_http:headers(). merge_headers(Headers, []) -> Headers; merge_headers(Headers, [{<<"Set-Cookie">>=Name, Value}|Tail]) -> merge_headers(Headers ++ [{Name, Value}], Tail); merge_headers(Headers, [{Name, Value}|Tail]) -> Headers2 = case lists:keymember(Name, 1, Headers) of true -> Headers; false -> Headers ++ [{Name, Value}] end, merge_headers(Headers2, Tail).
希望官方尽快解决这个问题~