2012-06-29 14 views
11

シナトラREADME saysSinatraのリクエスト["SOME_HEADER"]はPOSTで動作しません。 docのバグ?

request["SOME_HEADER"]  # value of SOME_HEADER header 

このアプリを考える:

require 'sinatra' 

post '/env' do 
    env['HTTP_X_FOO'] 
end 

post '/request' do 
    request['X-Foo'] 
end 

post '/request_rack_http_format' do 
    request['HTTP_X_FOO'] 
end 

最初のスペックが通過します。次の二つは失敗:

describe "Sinatra should place the header in" do 
    before(:all) do 
     header 'X-Foo', 'Bar' 
    end 

    example "env" do 
     post '/env' 
     last_response.body.should == 'Bar' #pass 
    end 

    example "request[]" do 
     post '/request' 
     last_response.body.should == 'Bar' #fail; got "" 
    end 

    example "request[] (rack format)" do 
     post '/request_rack_http_format' 
     last_response.body.should == 'Bar' #fail; got "" 
    end 
end 

は、シナトラが実際に []で何もしないソースを見てみると、それはラックで GETPOSTの組合として実装されています。そして、 POST just returns the form hashGETの場合はクエリハッシュです。 3つのルートすべてで、 request.paramsは空です。

私の質問:これはドキュメントのバグですか、私はrequest[]の使い方を誤解していますか?今のところ、私のアプリケーションはenv[]メソッドで正常に動作しています。しかし、私はそれを「正しい」行いたい。

答えて

11

ドキュメントのバグと思われます。 request[]は実際に要求しないヘッダーのparamsを取得:

https://github.com/rack/rack/blob/master/lib/rack/request.rb#L262

def [](key) 
    params[key.to_s] 
end 

Iは二重また試験によってそれを確認しました。ちょっとばかげているようですが、以外の場合は、直接ヘッダーに直接アクセスできないようです。env以外少なくとも私は他の方法を考え出すことができませんでした。

+0

私はあなたが正しいと思っています[ラックソース自体は 'env'を使うようです。](https://github.com/rack/rack/blob/master/lib/rack/request.rb#L308 ) –

+2

私は[READMEのSinatraで問題を開いた](https://github.com/sinatra/sinatra/issues/542)。 –

+0

はい、私の答えを参照してください –

6

私はシナトラが(多分ラック)HTTP_接頭辞(や大文字化)を追加すると思われるヘッダ内のparamは「SOME_HEADER」

であれば、私は

env['HTTP_SOME_HEADER'] 

でそれにアクセスできることを実現... strange。

0

うんGiorgioのヘッダが大文字であったので、同様にフォーマットされた前記のとおりアンダースコアに変換任意ハイフンで

env['HTTP_SOME_HEADER'] 

。それはかなり混乱しています。

関連する問題