Backport #229
closedCGI::Cookies can "get out of sync"
Description
=begin
CGI::Cookies are an instance of a DelegateClass of their @value instance variable,
which is always an Array. But changing a Cookie's value using the #value= instance
method of CGI::Cookie causes the Cookie to "get out of sync":
require "cgi"
cookie = CGI::Cookie.new("my-cookie", "first value", "second value")
cookie.value # => ["first value", "second value"]
cookie[0] # => "first value"
cookie[1] # => "second value"
cookie[2] = "new value"
cookie.each do |val|
val # => "first value", "second value", "new value"
end
cookie.inspect # => "["first value", "second value", "new value"]"
cookie.to_s # => "my-cookie=first+value&second+value&new+value; path="
cookie = CGI::Cookie.new("my-cookie", "first value", "second value")
cookie.value # => ["first value", "second value"]
This makes the cookie get out of sync¶
cookie.value = [ "test" ]
cookie[0] # => "first value"
cookie[1] # => "second value"
cookie[2] = "new value"
cookie.each do |val|
val # => "first value", "second value", "new value"
end
cookie.inspect # => "["first value", "second value", "new value"]"
cookie.to_s # => "my-cookie=test; path="
The attached patch fixes this issue.
=end
Files
Updated by shyouhei (Shyouhei Urabe) almost 16 years ago
- Assignee set to xibbar (Takeyuki FUJIOKA)
=begin
=end
Updated by marcandre (Marc-Andre Lafortune) about 15 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
=begin
Applied in changeset r24913.
=end
Updated by marcandre (Marc-Andre Lafortune) about 15 years ago
=begin
Notes: the problem was even more acute in Ruby 1.9, since Cookie is no longer a Delegate (ref: issue #502), e.g. cookie.value.unshift("something"). Rubyspecs have been updated for this kind of check.
Patch was applied as is in Ruby 1.8 and modified for Ruby 1.9 to account for the fact that Cookie is an Array.
=end
Updated by shyouhei (Shyouhei Urabe) about 15 years ago
- Status changed from Closed to Assigned
- Assignee changed from xibbar (Takeyuki FUJIOKA) to wyhaines (Kirk Haines)
=begin
1.8.6 also has this issue.
=end
Updated by wyhaines (Kirk Haines) over 14 years ago
- Status changed from Assigned to Closed
=begin
This issue was solved with changeset r27932.
Arthur, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.
=end