如何在 ruby 中保留自定义 headers 大小写

How to preserve custom headers case in ruby

HTTP 规范说明 headers 不区分大小写,我们需要调用 headers 区分大小写的服务。

下面是我的代码

require 'uri'
require 'net/http'
require 'openssl'

url = URI("Service URL")

http = Net::HTTP::Proxy('127.0.0.1', '8888').new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

request = Net::HTTP::Post.new(url)
request["content-type"] = 'text/xml'
request["charset"] = 'utf-8'
request["accept"] = 'text/xml'
request["host"] = 'abc.com'
request["HMACSignature"] = 'dsfsdfsdf'

response = http.request(request)
puts response.read_body

自定义 header 正在作为 Hmac 版本接收。

我也试过this但是没用。

是否有解决此问题的方法

如果可能的话,我会尝试更改服务器,这违反了 HTTP 标准,将请求 header 键视为 case-sensitive - "Field names are case-insensitive"。该错误会扰乱浏览器、缓存等。

如果您无法修复它,我可能会尝试 another HTTP client library 保留大小写,而不是 Net::HTTP。只需确保库不在幕后使用 Net::HTTP 即可。例如,您可以试试 Excon(我不确定它是否保留大小写,但它有很多 low-level 控制)。

使用以下代码强制区分大小写 headers。

class CaseSensitivePost < Net::HTTP::Post
  def initialize_http_header(headers)
    @header = {}
    headers.each{|k,v| @header[k.to_s] = [v] }
  end

  def [](name)
    @header[name.to_s]
  end

  def []=(name, val)
    if val
      @header[name.to_s] = [val]
    else
      @header.delete(name.to_s)
    end
  end

  def capitalize(name)
    name
  end
end

用法示例:

post = CaseSensitivePost.new(url, {myCasedHeader: '1'})
post.body = body
http = Net::HTTP.new(host, port)
http.request(post)

其他人建议创建自定义字符串 class,它不会被小写或大写。 https://whosebug.com/a/42121370/979995