summaryrefslogtreecommitdiff
path: root/lib/net
diff options
context:
space:
mode:
authorusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-09-09 13:50:10 +0000
committerusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-09-09 13:50:10 +0000
commitadd060094c498c835c3dfc50ace2ebd8b8bdfbcb (patch)
tree1b629eb79febf2e80f469f1f02785058010c4644 /lib/net
parentdbe8e9c578f42495872155afd8ea81c74814524f (diff)
merge revision(s) 59693,59695: [Backport #13852]
A HTTP Header value must not contain CR or LF. to_str -> to_s * lib/net/http/header.rb (set_field): `val` can not have `to_str`. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_3@59797 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/net')
-rw-r--r--lib/net/http/header.rb32
1 files changed, 30 insertions, 2 deletions
diff --git a/lib/net/http/header.rb b/lib/net/http/header.rb
index 5d99e8f070..7eee15e361 100644
--- a/lib/net/http/header.rb
+++ b/lib/net/http/header.rb
@@ -38,7 +38,7 @@ module Net::HTTPHeader
@header.delete key.downcase
return val
end
- @header[key.downcase] = [val]
+ set_field(key, val)
end
# [Ruby 1.8.3]
@@ -58,12 +58,40 @@ module Net::HTTPHeader
#
def add_field(key, val)
if @header.key?(key.downcase)
- @header[key.downcase].push val
+ append_field_value(@header[key.downcase], val)
else
+ set_field(key, val)
+ end
+ end
+
+ private def set_field(key, val)
+ case val
+ when Enumerable
+ ary = []
+ append_field_value(ary, val)
+ @header[key.downcase] = ary
+ else
+ val = val.to_s
+ if /[\r\n]/ =~ val
+ raise ArgumentError, 'header field value cannnot include CR/LF'
+ end
@header[key.downcase] = [val]
end
end
+ private def append_field_value(ary, val)
+ case val
+ when Enumerable
+ val.each{|x| append_field_value(ary, x)}
+ else
+ val = val.to_s
+ if /[\r\n]/ =~ val
+ raise ArgumentError, 'header field value cannnot include CR/LF'
+ end
+ ary.push val
+ end
+ end
+
# [Ruby 1.8.3]
# Returns an array of header field strings corresponding to the
# case-insensitive +key+. This method allows you to get duplicated