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).

希望官方尽快解决这个问题~