2012-04-21 7 views

答えて

5

を期待しています(RFC 2616)、ヘッダーフィールド名はcase-insensitiveです。そのため、サードパーティのサーバーには実装が壊れています。

本当に必要な場合は、保存時にフィールド名をダウンケースしてから初期キャップで書き込むため、Net :: HTTPでmonkey-patchで大文字小文字を維持できます。ここで

は、あなたが(Net::HTTPHeader#[]=)を使用しているストレージの方法です:それはヘッダー(Net::HTTPGenericRequest#write_header)を書き込み、どこ

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

そして、ここでは、次のとおりです。

# 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にパッチを当てるだけで済みました。 –

14

猿のパッチNet :: HTTPHeaderとNet:HTTPGenericRequestがダウンケースを削除して大文字にすることは可能ですが、すべてを強制するのではなく、選択的な大文字と小文字の区別が可能です。彼らは大文字と小文字が区別されたときにあなたの鍵を作成するために、次に

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

CaseSensitiveString.new( 'キー名'):

ソリューション。既存の動作を維持するには、他のキーに文字列/記号を使用します。これは、サルのパッチ適用よりはるかに簡単で、Net :: HTTPだけでなく、残りのクライアントライブラリでもうまく機能します。前の回答のオフ

+1

これはRubyがとても素晴らしい理由です –

+0

この解決策はruby-2.3.0ではうまくいかないことがわかります。しかし、下位バージョンでうまく動作します。 – ArjunUrs

2

ビル、これはルビー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を呼び出します。

関連する問題