停止红宝石http请求修改标题名称(stop ruby http request modifying

2019-09-16 16:06发布

我做的红宝石的http请求:

  http = Net::HTTP.new(uri.host, uri.port)
  req = Net::HTTP::Post.new(uri.path)
  req.body = payload
  req['customeheader'] = 'xxxxxxxxx'
  http.set_debug_output $stdout

我有调试接通和当该请求被发布我能看到头被张贴为:

  Customheader: xxxxxxxxx

反正有没有阻止这种,我张贴,因为头名是不正确的是给了一个错误的第三方服务器-这是期待customheader:

Answer 1:

根据HTTP规范(RFC 2616),报头字段名是不区分大小写的 。 因此,第三方服务器有一个破碎的实现。

如果你真的需要,你可以猴子补丁的Net :: HTTP保留的情况下,因为它downcases字段名称时,它存储它们,然后用首字母大写写他们。

这里有你所使用的存储方法( Net::HTTPHeader#[]= ):

# File net/http.rb, line 1160
    def []=(key, val)
      unless val
        @header.delete key.downcase
        return val
      end
      @header[key.downcase] = [val]
    end

这里是它写头( Net::HTTPGenericRequest#write_header ):

# File lib/net/http.rb, line 2071
    def write_header(sock, ver, path)
      buf = "#{@method} #{path} HTTP/#{ver}\r\n"
      each_capitalized do |k,v|
        buf << "#{k}: #{v}\r\n"
      end
      buf << "\r\n"
      sock.write buf
    end

这些都是有可能你需要重写的唯一方法,但我不是100%肯定。



Answer 2:

虽然这是可能的猴子补丁的Net ::的HTTPHeader和Net:HTTPGenericRequest去除downcase和把握,我发现了一个不同的方法,允许选择性区分大小写,而不是强迫的一切。

解决方案:

class CaseSensitiveString < String
    def downcase
        self
    end
    def capitalize
        self
    end
end

然后CaseSensitiveString.new(“键名”),当他们是大小写敏感的创建你的钥匙。 使用其他键串/符号,以保持现有行为。 这是比猴子修补更简单,与其他部分的客户端库运作良好,以及网:: HTTP。



Answer 3:

建设掀起了以前的答案的,这会为红宝石2.3工作:

class CaseSensitiveString < String
  def downcase
    self
  end

  def capitalize
    self
  end

  def to_s
    self
  end
end

to_s方法需要添加因为2.3, HTTP::Headercapitalize方法调用to_s在每个头标。



文章来源: stop ruby http request modifying header name
标签: ruby http