Skip to content

Commit

Permalink
Add new configuration to preserve headers case
Browse files Browse the repository at this point in the history
- Add new configuration to preserve headers case in Net::HTTP class
- Add new configuration to preserve headers case in GenericRequest class
  • Loading branch information
AllanSiqueira committed Aug 16, 2023
1 parent 328d28d commit b828e8f
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 2 deletions.
9 changes: 9 additions & 0 deletions lib/net/http.rb
Original file line number Diff line number Diff line change
Expand Up @@ -507,6 +507,10 @@ class HTTPHeaderSyntaxError < StandardError; end
# Returns the write timeout.
# - {write_timeout=}[rdoc-ref:Net::HTTP#write_timeout=]:
# Sets the write timeout.
# - {:preserve_headers}[rdoc-ref:Net::HTTP#preserve_headers]:
# Returns the open timeout.
# - {:preserve_headers=}[rdoc-ref:Net::HTTP#preserve_headers=]:
# Sets the read timeout.
#
# === Requests
#
Expand Down Expand Up @@ -1123,6 +1127,7 @@ def initialize(address, port = nil) # :nodoc:
@ssl_context = nil
@ssl_session = nil
@sspi_enabled = false
@preserve_headers = false
SSL_IVNAMES.each do |ivname|
instance_variable_set ivname, nil
end
Expand Down Expand Up @@ -1532,6 +1537,9 @@ def use_ssl=(flag)
# See {OpenSSL::SSL::SSLContext#verify_hostname=}[https://docs.ruby-lang.org/en/master/OpenSSL/SSL/SSLContext.html#attribute-i-verify_mode].
attr_accessor :verify_hostname

# Sets or returns whether to preserve the headers case
attr_accessor :preserve_headers

# Returns the X509 certificate chain (an array of strings)
# for the session's socket peer,
# or +nil+ if none.
Expand Down Expand Up @@ -2300,6 +2308,7 @@ def request(req, body = nil, &block) # :yield: +response+
return request(req, body, &block)
}
end
req.preserve_headers = preserve_headers
if proxy_user()
req.proxy_basic_auth proxy_user(), proxy_pass() unless use_ssl?
end
Expand Down
14 changes: 12 additions & 2 deletions lib/net/http/generic_request.rb
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ def initialize(m, reqbody, resbody, uri_or_path, initheader = nil) # :nodoc:
@body = nil
@body_stream = nil
@body_data = nil
@preserve_headers = false
end

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

# Sets if will preserve case from headers
attr_accessor :preserve_headers

# Returns a string representation of the request:
#
# Net::HTTP::Post.new(uri).inspect # => "#<Net::HTTP::Post POST>"
Expand Down Expand Up @@ -403,8 +407,14 @@ def write_header(sock, ver, path)
end
buf = +''
buf << reqline << "\r\n"
each_capitalized do |k,v|
buf << "#{k}: #{v}\r\n"
if preserve_headers
each_header do |k,v|
buf << "#{k}: #{v}\r\n"
end
else
each_capitalized do |k,v|
buf << "#{k}: #{v}\r\n"
end
end
buf << "\r\n"
sock.write buf
Expand Down
23 changes: 23 additions & 0 deletions test/net/http/test_http.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1367,4 +1367,27 @@ def test_partial_response
http.ignore_eof = false
assert_raise(EOFError) {http.get('/')}
end

def test_no_preserved_headers
headers = { accept: '*/*' }
expected_raw_header = "Accept: */*\r\n"
@server.mount_proc('/') do |req, _res|
assert_includes(req.raw_header, expected_raw_header)
end

http = Net::HTTP.new(config('host'), config('port'))
http.get('/', headers)
end

def test_preserved_headers
headers = { accept: '*/*' }
expected_raw_header = "accept: */*\r\n"
@server.mount_proc('/') do |req, _res|
assert_includes(req.raw_header, expected_raw_header)
end

http = Net::HTTP.new(config('host'), config('port'))
http.preserve_headers = true
http.get('/', headers)
end
end

0 comments on commit b828e8f

Please sign in to comment.