Class: Mechanize::Cookie

Inherits:
Object
  • Object
show all
Defined in:
lib/mechanize/cookie.rb

Overview

This class is used to represent an HTTP Cookie.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*args) ⇒ Cookie

:call-seq:

new(name, value)
new(name, value, attr_hash)
new(attr_hash)

Creates a cookie object. For each key of attr_hash, the setter is called if defined. Each key can be either a symbol or a string, downcased or not.

e.g.

new("uid", "a12345")
new("uid", "a12345", :domain => 'example.org',
                     :for_domain => true, :expired => Time.now + 7*86400)
new("name" => "uid", "value" => "a12345", "Domain" => 'www.example.org')


32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/mechanize/cookie.rb', line 32

def initialize(*args)
  @version = 0     # Netscape Cookie

  @domain = @path = @secure = @comment = @max_age =
    @expires = @comment_url = @discard = @port = nil

  @created_at = @accessed_at = Time.now
  case args.size
  when 2
    @name, @value = *args
    @for_domain = false
    return
  when 3
    @name, @value, attr_hash = *args
  when 1
    attr_hash = args.first
  else
    raise ArgumentError, "wrong number of arguments (#{args.size} for 1-3)"
  end
  for_domain = false
  attr_hash.each_pair { |key, val|
    skey = key.to_s.downcase
    skey.sub!(/[!?]\z/, '')
    case skey
    when 'for_domain'
      for_domain = !!val
    when 'name'
      @name = val
    when 'value'
      @value = val
    else
      setter = :"#{skey}="
      send(setter, val) if respond_to?(setter)
    end
  }
  @for_domain = for_domain
end

Instance Attribute Details

#accessed_atObject

Returns the value of attribute accessed_at.



15
16
17
# File 'lib/mechanize/cookie.rb', line 15

def accessed_at
  @accessed_at
end

#commentObject

Returns the value of attribute comment.



10
11
12
# File 'lib/mechanize/cookie.rb', line 10

def comment
  @comment
end

#created_atObject

Returns the value of attribute created_at.



14
15
16
# File 'lib/mechanize/cookie.rb', line 14

def created_at
  @created_at
end

#domainObject

Returns the value of attribute domain.



9
10
11
# File 'lib/mechanize/cookie.rb', line 9

def domain
  @domain
end

#for_domainObject Also known as: for_domain?

If this flag is true, this cookie will be sent to any host in the domain. If it is false, this cookie will be sent only to the host indicated by the domain.



73
74
75
# File 'lib/mechanize/cookie.rb', line 73

def for_domain
  @for_domain
end

#max_ageObject

Returns the value of attribute max_age.



10
11
12
# File 'lib/mechanize/cookie.rb', line 10

def max_age
  @max_age
end

#nameObject (readonly)

Returns the value of attribute name.



7
8
9
# File 'lib/mechanize/cookie.rb', line 7

def name
  @name
end

#pathObject

Returns the value of attribute path.



9
10
11
# File 'lib/mechanize/cookie.rb', line 9

def path
  @path
end

#secureObject Also known as: secure?

Returns the value of attribute secure.



9
10
11
# File 'lib/mechanize/cookie.rb', line 9

def secure
  @secure
end

#sessionObject

Returns the value of attribute session.



12
13
14
# File 'lib/mechanize/cookie.rb', line 12

def session
  @session
end

#valueObject

Returns the value of attribute value.



8
9
10
# File 'lib/mechanize/cookie.rb', line 8

def value
  @value
end

#versionObject

Returns the value of attribute version.



8
9
10
# File 'lib/mechanize/cookie.rb', line 8

def version
  @version
end

Class Method Details

.parse(uri, str, log = Mechanize.log) ⇒ Object

Parses a Set-Cookie header line str sent from uri into an array of Cookie objects. Note that this array may contain nil’s when some of the cookie-pairs are malformed.



80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/mechanize/cookie.rb', line 80

def parse(uri, str, log = Mechanize.log)
  return str.split(/,(?=[^;,]*=)|,$/).map { |c|
    cookie_elem = c.split(/;+/)
    first_elem = cookie_elem.shift
    first_elem.strip!
    key, value = first_elem.split(/\=/, 2)

    begin
      cookie = new(key, value.dup)
    rescue
      log.warn("Couldn't parse key/value: #{first_elem}") if log
      next
    end

    cookie_elem.each do |pair|
      pair.strip!
      key, value = pair.split(/=/, 2)
      next unless key
      value = WEBrick::HTTPUtils.dequote(value.strip) if value

      case key.downcase
      when 'domain'
        next unless value && !value.empty?
        begin
          cookie.domain = value
          cookie.for_domain = true
        rescue
          log.warn("Couldn't parse domain: #{value}") if log
        end
      when 'path'
        next unless value && !value.empty?
        cookie.path = value
      when 'expires'
        next unless value && !value.empty?
        begin
          cookie.expires = Time::parse(value)
        rescue
          log.warn("Couldn't parse expires: #{value}") if log
        end
      when 'max-age'
        next unless value && !value.empty?
        begin
          cookie.max_age = Integer(value)
        rescue
          log.warn("Couldn't parse max age '#{value}'") if log
        end
      when 'comment'
        next unless value
        cookie.comment = value
      when 'version'
        next unless value
        begin
          cookie.version = Integer(value)
        rescue
          log.warn("Couldn't parse version '#{value}'") if log
          cookie.version = nil
        end
      when 'secure'
        cookie.secure = true
      end
    end

    cookie.path    ||= (uri + './').path
    cookie.secure  ||= false
    cookie.domain  ||= uri.host

    # RFC 6265 4.1.2.2
    cookie.expires   = Time.now + cookie.max_age if cookie.max_age
    cookie.session   = !cookie.expires

    # Move this in to the cookie jar
    yield cookie if block_given?

    cookie
  }
end

Instance Method Details

#acceptable_from_uri?(uri) ⇒ Boolean

Returns:

  • (Boolean)


197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
# File 'lib/mechanize/cookie.rb', line 197

def acceptable_from_uri?(uri)
  host = DomainName.new(uri.host)

  # RFC 6265 5.3
  # When the user agent "receives a cookie":
  return host.hostname == domain unless @for_domain

  if host.cookie_domain?(@domain_name)
    true
  elsif host.hostname == domain
    @for_domain = false
    true
  else
    false
  end
end

#expired?Boolean

Returns:

  • (Boolean)


190
191
192
193
# File 'lib/mechanize/cookie.rb', line 190

def expired?
  return false unless expires
  Time.now > expires
end

#expiresObject



186
187
188
# File 'lib/mechanize/cookie.rb', line 186

def expires
  @expires && Time.parse(@expires)
end

#expires=(t) ⇒ Object



182
183
184
# File 'lib/mechanize/cookie.rb', line 182

def expires=(t)
  @expires = t && (t.is_a?(Time) ? t.httpdate : t.to_s)
end

#init_with(coder) ⇒ Object



223
224
225
# File 'lib/mechanize/cookie.rb', line 223

def init_with(coder)
  yaml_initialize(coder.tag, coder.map)
end

#set_domainObject

Sets the attribute domain

Parameters:

  • value

    the value to set the attribute domain to.



158
159
160
# File 'lib/mechanize/cookie.rb', line 158

def domain=(value)
  @domain = value
end

#to_sObject



219
220
221
# File 'lib/mechanize/cookie.rb', line 219

def to_s
  "#{@name}=#{@value}"
end

#valid_for_uri?(uri) ⇒ Boolean

Returns:

  • (Boolean)


214
215
216
217
# File 'lib/mechanize/cookie.rb', line 214

def valid_for_uri?(uri)
  return false if secure? && uri.scheme != 'https'
  acceptable_from_uri?(uri) && uri.path.start_with?(path)
end

#yaml_initialize(tag, map) ⇒ Object



227
228
229
230
231
232
233
234
235
236
237
# File 'lib/mechanize/cookie.rb', line 227

def yaml_initialize(tag, map)
  @for_domain = true    # for forward compatibility
  map.each { |key, value|
    case key
    when 'domain'
      self.domain = value # ditto
    else
      instance_variable_set(:"@#{key}", value)
    end
  }
end