Cookieの使い方

mzp2007-02-16

id:mzp:20070214:1171465153の続き。RubyのNet::HTTPでのクッキーの扱い方。

クッキーの受信

クッキは、Set-Cookie:というフィールドに書かれている。
ただし、複数のSet-Cookieフィールドが存在することが普通なので、Net::HTTP#get_fieldsを使って配列の形で取得する。

require 'net/http'

Net::HTTP.start('www.tohoho-web.com'){|http|
  response, = http.get '/cgi/wwwcook.cgi'
  p response.get_fields('Set-Cookie')
}

実行例:

["KAISUU=2; expires=Tue, 1-Jan-2030 00:00:00 GMT;", "HIZUKE=2007%2F02%2F16%2021%3A46%3A08; expires=Tue, 1-Jan-2030 00:00:00 GMT;"]

ただし、この状態でクッキーは

KAISUU=2; expires=Tue, 1-Jan-2030 00:00:00 GMT;

という形をしているので使いづらい。そこで、KAISUU=2の部分だけを取り出して、ハッシュに格納しておく。

require 'net/http'

cookie = {}
Net::HTTP.start('www.tohoho-web.com'){|http|
  response, = http.get '/cgi/wwwcook.cgi'

  response.get_fields('Set-Cookie').each{|str|
    k,v = str[0...str.index(';')].split('=')
    cookie[k] = v
  }
}
p cookie

実行結果:

{"HIZUKE"=>"2007%2F02%2F16%2021%3A47%3A51", "KAISUU"=>"2"}

クッキーの送信

送信するには、Cookieヘッダとして

HIZUKE=2007%2F02%2F16%2021%3A47%3A51;KAISUU=2

を送信してやればいい。

cookie={'HIZUKE'=>'2007%2F02%2F16%2021%3A47%3A51'
        'KAISUU'=>2}
Net::HTTP.start('www.tohoho-web.com'){|http|
  response, = http.get '/cgi/wwwcook.cgi',{'Cookie'=>cookie.map{|k,v|
      "#{k}=#{v}"
    }.join(';')}
  print response.body
}