CGI::Cookie.parse でSet-Cookieをパースしちゃいけないぽい。

railsマッシュアップのためのスクレイピングをしようとしていて、認証を通った先のやつを取ってこようとしている。いわゆる、ログインして、帰ってくるセッションのクッキーを保持した上でCookieヘッダをつけて目的ページを取りにいくってやつだ。早速以下キーワードなんかでググってみる。

ruby Cookie

なるほど、CGI::Cookieなるライブラリを使うのがよさげ。しかし、こいつでハマったという話。

自分がやりたい要件からすると、スクレイピングしたいサイトが送りつけてくるSet-Cookieレスポンスヘッダをまずは解釈して、CGI::Cookieインスタンスを作りたい。

で、CGI::CookieにはCGI::Cookie.parseなるメソッドがあり、ドキュメントに以下のように書いてあるではないか。

CGI::Cookie.parse(raw_cookie)
クッキー文字列をパースします。

例:
cookies = CGI::Cookie.parse("raw_cookie_string")
  # { "name1" => cookie1, "name2" => cookie2, ... }

出典:http://www.ruby-lang.org/ja/man/html/cgi.html 

「ラッキー」と思うのが普通かと思う。でも、そのまんま普通にそう思って使ってみたのが間違いでした。

おそらくこれって、

  • サーバが送ってくるSet-Cookieレスポンスヘッダの文字列をパースするんじゃなく
  • ブラウザが送ってくるCookieリクエストヘッダの文字列をパースするってことなのでは・・


うーん。今冷静に考えれば確かにそうだろうな。CGI::Cookieだしねぇ・・ しかし、もうちょっと親切にドキュメントに書いてくれればいいのになぁ・・(Rubyが少しだけ嫌いになった)

具体的にどういう現象に遭遇したかというと、以下のようなSet-Cookieの値をパースすると

CGISESSID=e11c73b42305fb428cb58145f3682064; path=/wiki/; expires=Sun, 27-Apr-2008 05:19:58 GMT

expires=Sun

とか、そんな風にパースされちゃう。なんで、そんなとこのカンマで切っちゃうのさー!的な・・


同じようにハマッタと思われる方がココにも・・
http://d.hatena.ne.jp/eclipse-a/20070910/1189410195
最初、「標準のがあるのに、何でこんな関数書いてんだろう・・ヘンなの」と思ったのだが、やっとわかったよ。

参考にさせてもらおっと^^