Erlang + yawsでSession(Cookie)ハンドリング

Erlangのhttpサーバであるyawsをいじって遊んでいます
おきまりのHttp関連の操作もどうやったらいいか分からずに
http://yaws.hyber.org/yman.yaws?page=yaws_api
この辺を見ながら試行錯誤。

とりあえずcookieを使用したsession操作をしたくて組んでみました。


out(Arg) ->
SessionName = "hogehoge",
% Session処理
C = (Arg#arg.headers)#headers.cookie,
{SessionCookie, SetCookie} = case yaws_api:find_cookie_val(SessionName, C) of
[] ->
Cookie = yaws_api:new_cookie_session({}),
CO = yaws_api:setcookie(SessionName, Cookie, "/"),
{Cookie, CO};
Cookie ->
case yaws_api:cookieval_to_opaque(Cookie) of
{ok, OP} ->
Cookie,
{Cookie, undefined};
{error, no_session} ->
CO = yaws_api:setcookie(SessionName, Cookie, "/"),
{Cookie, CO}
end
end,

case SetCookie of
undefined -> {html, "found cookie"};
_Else -> [SetCookie, {html, "cookie may be created"}]
end.

肝なのは最後の数行の


case SetCookie of
undefined -> {html, "found cookie"};
_Else -> [SetCookie, {html, "cookie may be created"}]
end.

この辺。つまりはSetCookieの変数部分の戻り値が、そのままheaderになっていて、html本文返す前にSet-Cookieヘッダ返さないといけないよ、という至極当たり前なことなのですが、この辺が隠蔽されていないフレームワークを使用するのが久々なのでちょっとはまった。

だって、このへん ( http://yaws.hyber.org/yman.yaws?page=yaws_api ) のマニュアルを見ても


setcookie(Name, Value, [Path, [ Expire, [Domain , [Secure]]]])
Sets a cookie to the browser.

って書いてあるだけで、ヘッダー相当の内容がこの関数から返ってくるとは思わなかった。
ちゃんと

case SetCookie of
undefined -> {html, "found cookie"};
_Else -> [SetCookie, {html, "cookie may be created"}]
end.

こう書いたら、

200 OK. .Server: Yaws 1. 90..Date: Sun, 1 9 Jun 20 11 14:53 :25 GMT.
.Content -Length: 22..Con tent-Type: text/ html
Set-Cookie : hogehoge=nonod e@nohost-3786894 771773034497;
path=/

こんな感じでSet-Cookieヘッダ返ってきて、めでたしめでたし。

うーーーん、2時間近くはまったなぁ