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 181181module Net ::HTTPHeader
182182 MAX_KEY_LENGTH = 1024
183183 MAX_FIELD_LENGTH = 65536
184+ MAX_HEADER_LENGTH = 1024 * 1024 # 1 MiB
184185
185186 def initialize_http_header ( initheader ) #:nodoc:
186187 @header = { }
187188 return unless initheader
189+
190+ total_header_size = 0
188191 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+
189197 warn "net/http: duplicated HTTP header: #{ key } " , uplevel : 3 if key? ( key ) and $VERBOSE
190198 if value . nil?
191199 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
4040 assert_equal "abc" , @c [ "foo" ]
4141 end
4242
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+
4357 def test_size
4458 assert_equal 0 , @c . size
4559 @c [ 'a' ] = 'a'
You can’t perform that action at this time.
0 commit comments