2012-04-21 58 views
4

我做的紅寶石的http請求:停止紅寶石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:

回答

5

根據HTTP規範(RFC 2616),標題字段名稱是case-insensitive。所以第三方服務器有一個破壞的實現。

如果你真的需要,你可以猴子補丁Net :: HTTP來保存大小寫,因爲它會在字段名稱存儲時降低字段名稱,然後用首字母大寫寫入。

這裏是你所使用的存儲方法(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%確定的。

+0

謝謝 - 我沒有想到這一點。順便提一下,只需要在這個特定情況下修補write_header。 – 2012-04-23 07:19:23

14

儘管可以修補Net :: HTTPHeader和Net:HTTPGenericRequest來刪除downcase和capitalize,但我發現了一種不同的方法,它允許選擇性區分大小寫,而不是強制所有內容。

解決辦法:

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

然後CaseSensitiveString.new( '鍵名')來創建密鑰時,他們是區分大小寫的。對其他鍵使用字符串/符號來維護現有行爲。這比猴子修補更簡單,並且與其餘客戶端庫以及Net :: HTTP一起使用。

+1

這就是爲什麼Ruby太棒了 – 2013-09-26 14:35:38

+0

我發現這個解決方案不適用於ruby-2.3.0。但是,對於較低版本可以正常工作。 – ArjunUrs 2016-06-23 23:38:04

2

建設掀起了以前的答案,這將會對Ruby 2.3的工作:

class CaseSensitiveString < String 
    def downcase 
    self 
    end 

    def capitalize 
    self 
    end 

    def to_s 
    self 
    def 
end 

to_s方法需要被添加因爲2.3,HTTP::Headercapitalize方法調用每個頭to_s