Skip to content

Commit d2e2cac

Browse files
authored
Merge multiple cookie headers, preserving semantic correctness. (#130)
1 parent 7675115 commit d2e2cac

File tree

3 files changed

+26
-3
lines changed

3 files changed

+26
-3
lines changed

lib/webrick/httprequest.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ def content_type
318318
def [](header_name)
319319
if @header
320320
value = @header[header_name.downcase]
321-
value.empty? ? nil : value.join(", ")
321+
value.empty? ? nil : value.join
322322
end
323323
end
324324

@@ -329,7 +329,7 @@ def each
329329
if @header
330330
@header.each{|k, v|
331331
value = @header[k]
332-
yield(k, value.empty? ? nil : value.join(", "))
332+
yield(k, value.empty? ? nil : value.join)
333333
}
334334
end
335335
end

lib/webrick/httputils.rb

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,22 @@ def mime_type(filename, mime_tab)
152152
# Parses an HTTP header +raw+ into a hash of header fields with an Array
153153
# of values.
154154

155+
class SplitHeader < Array
156+
def join(separator = ", ")
157+
super
158+
end
159+
end
160+
161+
class CookieHeader < Array
162+
def join(separator = "; ")
163+
super
164+
end
165+
end
166+
167+
HEADER_CLASSES = Hash.new(SplitHeader).update({
168+
"cookie" => CookieHeader,
169+
})
170+
155171
def parse_header(raw)
156172
header = Hash.new([].freeze)
157173
field = nil
@@ -160,7 +176,7 @@ def parse_header(raw)
160176
when /^([A-Za-z0-9!\#$%&'*+\-.^_`|~]+):(.*?)\z/om
161177
field, value = $1, $2.strip
162178
field.downcase!
163-
header[field] = [] unless header.has_key?(field)
179+
header[field] = HEADER_CLASSES[field].new unless header.has_key?(field)
164180
header[field] << value
165181
when /^\s+(.*?)/om
166182
value = line.strip

test/webrick/test_httprequest.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -532,4 +532,11 @@ def test_eof_raised_when_line_is_nil
532532
req.parse(StringIO.new(""))
533533
}
534534
end
535+
536+
def test_cookie_join
537+
req = WEBrick::HTTPRequest.new(WEBrick::Config::HTTP)
538+
req.parse(StringIO.new("GET / HTTP/1.1\r\ncookie: a=1\r\ncookie: b=2\r\n\r\n"))
539+
assert_equal 2, req.cookies.length
540+
assert_equal 'a=1; b=2', req['cookie']
541+
end
535542
end

0 commit comments

Comments
 (0)