Skip to content

Commit 844b130

Browse files
committed
Add new configuration to preserve headers case
- Add new configuration to preserve headers case in Net::HTTP class - Add new configuration to preserve headers case in GenericRequest class
1 parent 705e7c0 commit 844b130

File tree

3 files changed

+44
-2
lines changed

3 files changed

+44
-2
lines changed

lib/net/http.rb

+9
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,10 @@ class HTTPHeaderSyntaxError < StandardError; end
507507
# Returns the write timeout.
508508
# - {write_timeout=}[rdoc-ref:Net::HTTP#write_timeout=]:
509509
# Sets the write timeout.
510+
# - {:preserve_headers}[rdoc-ref:Net::HTTP#preserve_headers]:
511+
# Returns the open timeout.
512+
# - {:preserve_headers=}[rdoc-ref:Net::HTTP#preserve_headers=]:
513+
# Sets the read timeout.
510514
#
511515
# === Requests
512516
#
@@ -1123,6 +1127,7 @@ def initialize(address, port = nil) # :nodoc:
11231127
@ssl_context = nil
11241128
@ssl_session = nil
11251129
@sspi_enabled = false
1130+
@preserve_headers = false
11261131
SSL_IVNAMES.each do |ivname|
11271132
instance_variable_set ivname, nil
11281133
end
@@ -1532,6 +1537,9 @@ def use_ssl=(flag)
15321537
# See {OpenSSL::SSL::SSLContext#verify_hostname=}[https://docs.ruby-lang.org/en/master/OpenSSL/SSL/SSLContext.html#attribute-i-verify_mode].
15331538
attr_accessor :verify_hostname
15341539

1540+
# Sets or returns whether to preserve the headers case
1541+
attr_accessor :preserve_headers
1542+
15351543
# Returns the X509 certificate chain (an array of strings)
15361544
# for the session's socket peer,
15371545
# or +nil+ if none.
@@ -2300,6 +2308,7 @@ def request(req, body = nil, &block) # :yield: +response+
23002308
return request(req, body, &block)
23012309
}
23022310
end
2311+
req.preserve_headers = preserve_headers
23032312
if proxy_user()
23042313
req.proxy_basic_auth proxy_user(), proxy_pass() unless use_ssl?
23052314
end

lib/net/http/generic_request.rb

+12-2
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ def initialize(m, reqbody, resbody, uri_or_path, initheader = nil) # :nodoc:
5555
@body = nil
5656
@body_stream = nil
5757
@body_data = nil
58+
@preserve_headers = false
5859
end
5960

6061
# Returns the string method name for the request:
@@ -94,6 +95,9 @@ def initialize(m, reqbody, resbody, uri_or_path, initheader = nil) # :nodoc:
9495
#
9596
attr_reader :decode_content
9697

98+
# Sets if will preserve case from headers
99+
attr_accessor :preserve_headers
100+
97101
# Returns a string representation of the request:
98102
#
99103
# Net::HTTP::Post.new(uri).inspect # => "#<Net::HTTP::Post POST>"
@@ -403,8 +407,14 @@ def write_header(sock, ver, path)
403407
end
404408
buf = ""
405409
buf << reqline << "\r\n"
406-
each_capitalized do |k,v|
407-
buf << "#{k}: #{v}\r\n"
410+
if preserve_headers
411+
each_header do |k,v|
412+
buf << "#{k}: #{v}\r\n"
413+
end
414+
else
415+
each_capitalized do |k,v|
416+
buf << "#{k}: #{v}\r\n"
417+
end
408418
end
409419
buf << "\r\n"
410420
sock.write buf

test/net/http/test_http.rb

+23
Original file line numberDiff line numberDiff line change
@@ -1367,4 +1367,27 @@ def test_partial_response
13671367
http.ignore_eof = false
13681368
assert_raise(EOFError) {http.get('/')}
13691369
end
1370+
1371+
def test_no_preserved_headers
1372+
headers = { accept: '*/*' }
1373+
expected_raw_header = "Accept: */*\r\n"
1374+
@server.mount_proc('/') do |req, _res|
1375+
assert_includes(req.raw_header, expected_raw_header)
1376+
end
1377+
1378+
http = Net::HTTP.new(config('host'), config('port'))
1379+
http.get('/', headers)
1380+
end
1381+
1382+
def test_preserved_headers
1383+
headers = { accept: '*/*' }
1384+
expected_raw_header = "accept: */*\r\n"
1385+
@server.mount_proc('/') do |req, _res|
1386+
assert_includes(req.raw_header, expected_raw_header)
1387+
end
1388+
1389+
http = Net::HTTP.new(config('host'), config('port'))
1390+
http.preserve_headers = true
1391+
http.get('/', headers)
1392+
end
13701393
end

0 commit comments

Comments
 (0)