を変更停止ルビーhttpリクエスト私はRubyでHTTPリクエストをやっているヘッダ名
ヘッダ名が正しくないためCustomheader: xxxxxxxxx
はこれを停止するには、とにかく、私はエラーを与えているために掲示していますサードパーティ製のサーバがあります - それは、HTTPの仕様によるとcustomheader:
を変更停止ルビーhttpリクエスト私はRubyでHTTPリクエストをやっているヘッダ名
ヘッダ名が正しくないためCustomheader: xxxxxxxxx
はこれを停止するには、とにかく、私はエラーを与えているために掲示していますサードパーティ製のサーバがあります - それは、HTTPの仕様によるとcustomheader:
を期待しています(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%確実ではありません。
猿のパッチNet :: HTTPHeaderとNet:HTTPGenericRequestがダウンケースを削除して大文字にすることは可能ですが、すべてを強制するのではなく、選択的な大文字と小文字の区別が可能です。彼らは大文字と小文字が区別されたときにあなたの鍵を作成するために、次に
class CaseSensitiveString < String
def downcase
self
end
def capitalize
self
end
end
CaseSensitiveString.new( 'キー名'):
ソリューション。既存の動作を維持するには、他のキーに文字列/記号を使用します。これは、サルのパッチ適用よりはるかに簡単で、Net :: HTTPだけでなく、残りのクライアントライブラリでもうまく機能します。前の回答のオフ
これはRubyがとても素晴らしい理由です –
この解決策はruby-2.3.0ではうまくいかないことがわかります。しかし、下位バージョンでうまく動作します。 – ArjunUrs
ビル、これはルビー2.3ために働く:
class CaseSensitiveString < String
def downcase
self
end
def capitalize
self
end
def to_s
self
def
end
to_s
方法が原因2.3のように追加する必要があり、HTTP::Header
のcapitalize
方法は、各ヘッダにto_s
を呼び出します。
ありがとう - 私はそれを考えなかった。ちなみに、この特定のケースでは、write_headerにパッチを当てるだけで済みました。 –