Web::CookieManager Class
Load, save, parse and send cookies.
Usage
## initialize cm = Web::CookieManager.new("/home/foo/bar/cookie") ## load cookie data cm.load_cookies() ## parse cookie from string (maybe "Set-Cookie:" header) cm.parse(str) ## send cookie data to url f.write(cm.find(url)) ## save cookie to cookiefile cm.save_cookies()
Class Methods
-- CookieManager::new(file=nil) create new CookieManager. If a file is provided, use it as cookies' file.
Methods
-- CookieManager#save_cookies(force = nil) save cookies' data into file. if argument is true, save data although data is not modified. -- CookieManager#parse(str, url) parse string and store cookie (to parse HTTP response header). -- CookieManager#find(url) get cookies and make into string (to send as HTTP request header). -- CookieManager#add(cookie) add new cookie. -- CookieManager#load_cookies() load cookies' data from file.
Methods
- add
- check_cookie_accept_domain
- check_expired_cookies
- cookie_error
- find
- find_cookie_info
- load_cookies
- make_cookie_str
- new
- parse
- save_all_cookies
- save_cookies
Included Modules
Classes and Modules
Class Web::CookieManager::ErrorClass Web::CookieManager::ErrorOverrideOK
Class Web::CookieManager::NoDotError
Class Web::CookieManager::SpecialError
Constants
SPECIAL_DOMAIN | = | [".com",".edu",".gov",".mil",".net",".org",".int"] |
Attributes
[RW] | accept_domains | |
[RW] | cookies | |
[RW] | cookies_file | |
[RW] | netscape_rule | |
[RW] | reject_domains |
Public Class methods
[ show source ]
# File lib/facets/more/cookie.rb, line 348 def initialize(file=nil) @cookies = Array.new() @cookies_file = file @is_saved = true @reject_domains = Array.new() @accept_domains = Array.new() # for conformance to http://wp.netscape.com/newsref/std/cookie_spec.html @netscape_rule = false end
Public Instance methods
[ show source ]
# File lib/facets/more/cookie.rb, line 444 def add(cookie) url = cookie.url name, value = cookie.name, cookie.value expires, domain, path = cookie.expires, cookie.domain, cookie.path secure, domain_orig, path_orig = cookie.secure?, cookie.domain_orig?, cookie.path_orig? discard, override = cookie.discard?, cookie.override? domainname = url.host domain_orig, path_orig = domain, path use_security = override if !domainname cookie_error(NodotError.new(), override) end if domain # [DRAFT 12] s. 4.2.2 (does not apply in the case that # host name is the same as domain attribute for version 0 # cookie) # I think that this rule has almost the same effect as the # tail match of [NETSCAPE]. if domain !~ /^\./ && domainname != domain domain = '.'+domain end n = total_dot_num(domain) if n < 2 cookie_error(SpecialError.new(), override) elsif @netscape_rule and n == 2 ## [NETSCAPE] rule ok = SPECIAL_DOMAIN.select{|sdomain| sdomain == domain[-(sdomain.length)..-1] } if ok.empty? cookie_error(SpecialError.new(), override) end end end path ||= url.path.sub!(%r|/[^/]*|, '') domain ||= domainname cookie = find_cookie_info(domain, path, name) if !cookie cookie = Web::Cookie.new() cookie.use = true @cookies << cookie end cookie.url = url cookie.name = name cookie.value = value cookie.expires = expires cookie.domain = domain cookie.path = path ## for flag cookie.secure = secure cookie.domain_orig = domain_orig cookie.path_orig = path_orig if discard || cookie.expires == nil cookie.discard = true else cookie.discard = false @is_saved = false end check_expired_cookies() return false end
[ show source ]
# File lib/facets/more/cookie.rb, line 538 def check_cookie_accept_domain(domain) unless domain return false end @accept_domains.each{|dom| if domain_match(domain, dom) return true end } @reject_domains.each{|dom| if domain_match(domain, dom) return false end } return true end
[ show source ]
# File lib/facets/more/cookie.rb, line 382 def check_expired_cookies() @cookies.reject!{|cookie| is_expired = (cookie.expires && (cookie.expires < Time.now.gmtime)) if is_expired && !cookie.discard? @is_saved = false end is_expired } end
[ show source ]
# File lib/facets/more/cookie.rb, line 414 def find(url) check_expired_cookies() cookie_list = Array.new() @cookies.each{|cookie| if cookie.use? && cookie.match?(url) if cookie_list.select{|c1| c1.name == cookie.name}.empty? cookie_list << cookie end end } return make_cookie_str(cookie_list) end
[ show source ]
# File lib/facets/more/cookie.rb, line 520 def load_cookies() return if !File.readable?(@cookies_file) File.open(@cookies_file,'r'){|f| while line = f.gets cookie = Web::Cookie.new() @cookies << cookie col = line.chomp.split(/\t/) cookie.url = URI.parse(col[0]) cookie.name = col[1] cookie.value = col[2] cookie.expires = Time.at(col[3].to_i) cookie.domain = col[4] cookie.path = col[5] cookie.set_flag(col[6]) end } end
[ show source ]
# File lib/facets/more/cookie.rb, line 392 def parse(str, url) cookie = Web::Cookie.new() cookie.parse(str, url) add(cookie) end
[ show source ]
# File lib/facets/more/cookie.rb, line 358 def save_all_cookies(force = nil, save_unused = true, save_discarded = true) if @is_saved and !force return end File.open(@cookies_file, 'w') do |f| @cookies.each do |cookie| if (cookie.use? or save_unused) and (!cookie.discard? or save_discarded) f.print(cookie.url.to_s,"\t", cookie.name,"\t", cookie.value,"\t", cookie.expires.to_i,"\t", cookie.domain,"\t", cookie.path,"\t", cookie.flag,"\n") end end end end
[ show source ]
# File lib/facets/more/cookie.rb, line 378 def save_cookies(force = nil) save_all_cookies(force, false, false) end
Private Instance methods
[ show source ]
# File lib/facets/more/cookie.rb, line 437 def cookie_error(err, override) if err.kind_of?(ErrorOverrideOK) || !override raise err end end
[ show source ]
# File lib/facets/more/cookie.rb, line 430 def find_cookie_info(domain, path, name) @cookies.find{|c| c.domain == domain && c.path == path && c.name == name } end
[ show source ]
# File lib/facets/more/cookie.rb, line 398 def make_cookie_str(cookie_list) if cookie_list.empty? return nil end ret = '' c = cookie_list.shift ret += "#{c.name}=#{c.value}" cookie_list.each{|cookie| ret += "; #{cookie.name}=#{cookie.value}" } return ret end