2009年
8月
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

setup diary

2007|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|06|08|11|
2015|01|02|03|04|05|06|07|08|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|

2009-08-30 rubyでCookieの処理

_ カンマが面倒だ

最近のwebサイトでは、cookieを使っているものが多くなっている。試しに
require 'net/http'
Net::HTTP::new('www.google.co.jp').start{|h|
  puts h.get('/index.html')['set-cookie']
}
として、googleにアクセスすると、
PREF=ID=***:TM=***:LM=***:S=***; expires=Tue, 30-Aug-2011 07:13:47 GMT; path=/; domain=.google.co.jp
となった。***は数字とアルファベットの列だが。このようなcookieを渡されているということだ。PREFに=以下の値を与えているのだが、値に=が含まれても良いようだ。 ここで、困っているのが、有効期限のexpiresにカンマが含まれていることだ。cookieが一つだけのときは問題無いのだが、二つ以上の場合は、上のような書式をカンマでつなぐ。これを分解するときには、カンマでsplitすれば良いはずなのだが、それだとexpiresのカンマでも区切られてしまう。expires=のすぐ後にないカンマで区切れば良いかも知れないが、書式が完全では無いcookieを返すサイトもあるだろうし、いろいろと面倒だ。 例えば、
a=aaa; expires=Tue, 30-Aug-2011 07:13:47 GMT; path=/; domain=.google.co.jp
a=aaa; expires=30-Aug-2011 07:13:47 GMT, b=bbb; expires=30-Aug-2011 07:13:47 GMT
というcookieを解釈する場合、上は一つの値で、下は二つの値が記述してあるが、expiresのすぐあとのカンマを無視するようにした場合、下でも一つの値しか規程していないように解釈してしまう。 rubyには、CGI::Cookie.parse(string)というmethodがあるので、これを使ってみたが、大した処理をしてくれるわけではないようで、ときどき誤った解釈をする。できれば簡単な正規表現で処理したいのだが、真面目に考えると、結構面倒なスクリプトを書かなければいけない気がする。