CGI::Cookie.parse でSet-Cookieをパースしちゃいけないぽい。
railsでマッシュアップのためのスクレイピングをしようとしていて、認証を通った先のやつを取ってこようとしている。いわゆる、ログインして、帰ってくるセッションのクッキーを保持した上でCookieヘッダをつけて目的ページを取りにいくってやつだ。早速以下キーワードなんかでググってみる。
なるほど、CGI::Cookieなるライブラリを使うのがよさげ。しかし、こいつでハマったという話。
自分がやりたい要件からすると、スクレイピングしたいサイトが送りつけてくるSet-Cookieレスポンスヘッダをまずは解釈して、CGI::Cookieのインスタンスを作りたい。
で、CGI::CookieにはCGI::Cookie.parseなるメソッドがあり、ドキュメントに以下のように書いてあるではないか。
例: cookies = CGI::Cookie.parse("raw_cookie_string") # { "name1" => cookie1, "name2" => cookie2, ... }
出典:http://www.ruby-lang.org/ja/man/html/cgi.html
「ラッキー」と思うのが普通かと思う。でも、そのまんま普通にそう思って使ってみたのが間違いでした。
おそらくこれって、
うーん。今冷静に考えれば確かにそうだろうな。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
最初、「標準のがあるのに、何でこんな関数書いてんだろう・・ヘンなの」と思ったのだが、やっとわかったよ。
参考にさせてもらおっと^^