Define HTTP::Cookie#name= with validation.

This commit is contained in:
Akinori MUSHA 2012-10-22 03:52:25 +09:00
parent e18013e25e
commit a47a849387
2 changed files with 21 additions and 10 deletions

View file

@ -47,8 +47,7 @@ class HTTP::Cookie
include URIFix if defined?(URIFix) include URIFix if defined?(URIFix)
attr_reader :name attr_accessor :name, :value, :version
attr_accessor :value, :version
attr_accessor :domain, :path, :secure attr_accessor :domain, :path, :secure
attr_reader :domain_name attr_reader :domain_name
attr_accessor :comment, :max_age attr_accessor :comment, :max_age
@ -84,11 +83,11 @@ class HTTP::Cookie
@created_at = @accessed_at = Time.now @created_at = @accessed_at = Time.now
case args.size case args.size
when 2 when 2
@name, @value = *args self.name, self.value = *args
@for_domain = false @for_domain = false
return return
when 3 when 3
@name, @value, attr_hash = *args self.name, self.value, attr_hash = *args
when 1 when 1
attr_hash = args.first attr_hash = args.first
else else
@ -104,10 +103,6 @@ class HTTP::Cookie
case skey case skey
when 'for_domain' when 'for_domain'
for_domain = !!val for_domain = !!val
when 'name'
@name = val
when 'value'
@value = val
when 'origin' when 'origin'
origin = val origin = val
else else
@ -115,6 +110,9 @@ class HTTP::Cookie
send(setter, val) if respond_to?(setter) send(setter, val) if respond_to?(setter)
end end
} }
if @name.nil? || @value.nil?
raise ArgumentError, "at least name and value must be specified"
end
@for_domain = for_domain @for_domain = for_domain
if origin if origin
self.origin = origin self.origin = origin
@ -259,6 +257,15 @@ class HTTP::Cookie
end end
end end
def name=(name)
if name.nil? || name.empty?
raise ArgumentError, "cookie name cannot be empty"
elsif name.match(/[\x00-\x1F=\x7F]/)
raise ArgumentError, "cookie name cannot contain a control character or an equal sign"
end
@name = name
end
# Sets the domain attribute. A leading dot in +domain+ implies # Sets the domain attribute. A leading dot in +domain+ implies
# turning the +for_domain?+ flag on. # turning the +for_domain?+ flag on.
def domain=(domain) def domain=(domain)
@ -382,8 +389,6 @@ class HTTP::Cookie
def yaml_initialize(tag, map) def yaml_initialize(tag, map)
map.each { |key, value| map.each { |key, value|
case key case key
when 'name'
@name = value
when *PERSISTENT_PROPERTIES when *PERSISTENT_PROPERTIES
send(:"#{key}=", value) send(:"#{key}=", value)
end end

View file

@ -463,6 +463,12 @@ class TestHTTPCookie < Test::Unit::TestCase
assert_equal expires, cookie.expires assert_equal expires, cookie.expires
assert_equal 'example.org', cookie.domain assert_equal 'example.org', cookie.domain
assert_equal true, cookie.for_domain? assert_equal true, cookie.for_domain?
assert_raises(ArgumentError) { HTTP::Cookie.new(:name => 'name') }
assert_raises(ArgumentError) { HTTP::Cookie.new(:value => 'value') }
assert_raises(ArgumentError) { HTTP::Cookie.new('', 'value') }
assert_raises(ArgumentError) { HTTP::Cookie.new('key=key', 'value') }
assert_raises(ArgumentError) { HTTP::Cookie.new("key\tkey", 'value') }
end end
def cookie_values(options = {}) def cookie_values(options = {})