File tree Expand file tree Collapse file tree 2 files changed +22
-0
lines changed Expand file tree Collapse file tree 2 files changed +22
-0
lines changed Original file line number Diff line number Diff line change 181
181
module Net ::HTTPHeader
182
182
MAX_KEY_LENGTH = 1024
183
183
MAX_FIELD_LENGTH = 65536
184
+ MAX_HEADER_LENGTH = 1024 * 1024 # 1 MiB
184
185
185
186
def initialize_http_header ( initheader ) #:nodoc:
186
187
@header = { }
187
188
return unless initheader
189
+
190
+ total_header_size = 0
188
191
initheader . each do |key , value |
192
+ total_header_size += ( key . to_s . bytesize + ( value ? value . to_s . bytesize : 0 ) )
193
+ if total_header_size > MAX_HEADER_LENGTH
194
+ raise ArgumentError , "headers too large (#{ total_header_size } bytes exceeds #{ MAX_HEADER_LENGTH } bytes limit)"
195
+ end
196
+
189
197
warn "net/http: duplicated HTTP header: #{ key } " , uplevel : 3 if key? ( key ) and $VERBOSE
190
198
if value . nil?
191
199
warn "net/http: nil HTTP header: #{ key } " , uplevel : 3 if $VERBOSE
Original file line number Diff line number Diff line change @@ -40,6 +40,20 @@ def test_initialize_with_symbol
40
40
assert_equal "abc" , @c [ "foo" ]
41
41
end
42
42
43
+ def test_initialize_with_max_header_length_exceeded
44
+ field_value = 'x' * ( Net ::HTTPHeader ::MAX_FIELD_LENGTH - 100 )
45
+ num_headers = ( Net ::HTTPHeader ::MAX_HEADER_LENGTH / Net ::HTTPHeader ::MAX_FIELD_LENGTH ) + 2
46
+
47
+ large_headers = { }
48
+ num_headers . times do |i |
49
+ large_headers [ "Header#{ i } " ] = field_value
50
+ end
51
+
52
+ assert_raise ( ArgumentError ) do
53
+ @c . initialize_http_header ( large_headers )
54
+ end
55
+ end
56
+
43
57
def test_size
44
58
assert_equal 0 , @c . size
45
59
@c [ 'a' ] = 'a'
You can’t perform that action at this time.
0 commit comments