WASHでのCookieの扱い
WIKIに簡単なパスワード認証の機能を付けようと思って、Cookieの使い方についていろいろ調べてみた。
そもそもサンプルコードがコンパイルできない(型エラー)のでとてもあやしいが。
型が合うように適当にサンプルを書き換えたソースがこれ。
module Main where import WASH.CGI.CGI import qualified WASH.CGI.Cookie as C main :: IO () main = run $ do usernameC <- C.initExpiring "username" 10 "guest" username <- C.get usernameC case username of Just "guest" -> standardQuery "What's your name?" $ p (do text "Hi there! What's your name?" activate (helloCookie usernameC) textInputField empty) Just uname -> hello uname helloCookie nameC name = do C.set nameC name hello name hello :: String -> CGI () hello name = standardQuery ("hello, "++name) $ text $ "Hello, "++name
C.initExpiringは、Cookieの名前と有効な時間(分)とCookieの内容を引数に取る。
まずブラウザのCookieを調べて、もし指定した名前と同じ名前のものがあれば、そのCookieへのハンドラを返す(この場合はusernameという名前のCookieが探される)。なければ、指定した内容(この場合はguest)でCookieが新たに作られ、そのハンドラが返される。
C.getは、initExpiringで返されたハンドラをもらって、その内容を返す関数である。
なのでこの場合、最初のアクセスの際にはユーザ名の入力を促され、それ以降10分間は、このページにアクセスするといきなりhelloと言われるはずである。でも、うまくいかない。
で、適当にアクセスしてブラウザのCookieを確認してみると、Cookieの名前が"u"で、内容が"P"になってる。そりゃあうまくいかんわ。名前がuなのはusernameの先頭だからだろうけど、内容がPってのはまるでわからん。いや、名前がuだけなのもわからんのだけど。
ちなみにこれと全く同じ事が、ラジオボタンを作るときに起こりました。ラジオボタンの識別子には、指定した文字列の先頭1文字が使われていたのです。
これはバグ?それとも俺の使い方が悪い?