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
Included Modules
Classes and Modules
Class Web::CookieManager::Error
Class 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
new(file=nil)
# 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
add(cookie)
# 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
check_cookie_accept_domain(domain)
# 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
check_expired_cookies()
# 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
find(url)
# 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
load_cookies()
# 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
parse(str, url)
# File lib/facets/more/cookie.rb, line 392
    def parse(str, url)
      cookie = Web::Cookie.new()
      cookie.parse(str, url)
      add(cookie)
    end
save_all_cookies(force = nil, save_unused = true, save_discarded = true)
# 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
save_cookies(force = nil)
# File lib/facets/more/cookie.rb, line 378
    def save_cookies(force = nil)
      save_all_cookies(force, false, false)
    end
Private Instance methods
cookie_error(err, override)
# File lib/facets/more/cookie.rb, line 437
    def cookie_error(err, override)
      if err.kind_of?(ErrorOverrideOK) || !override
        raise err
      end
    end
find_cookie_info(domain, path, name)
# 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
make_cookie_str(cookie_list)
# 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