我做的红宝石的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:
根据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%肯定。
虽然这是可能的猴子补丁的Net ::的HTTPHeader和Net:HTTPGenericRequest去除downcase和把握,我发现了一个不同的方法,允许选择性区分大小写,而不是强迫的一切。
解决方案:
class CaseSensitiveString < String
def downcase
self
end
def capitalize
self
end
end
然后CaseSensitiveString.new(“键名”),当他们是大小写敏感的创建你的钥匙。 使用其他键串/符号,以保持现有行为。 这是比猴子修补更简单,与其他部分的客户端库运作良好,以及网:: HTTP。
建设掀起了以前的答案的,这会为红宝石2.3工作:
class CaseSensitiveString < String
def downcase
self
end
def capitalize
self
end
def to_s
self
end
end
的to_s
方法需要添加因为2.3, HTTP::Header
的capitalize
方法调用to_s
在每个头标。