Sinatra请求["SOME_HEADER"]不适用于POST; doc bug?

Cra*_*ntz 12 ruby rack sinatra

Sinatra自述文件:

request["SOME_HEADER"]      # value of SOME_HEADER header
Run Code Online (Sandbox Code Playgroud)

鉴于此应用程序:

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
Run Code Online (Sandbox Code Playgroud)

第一个规范通过; 接下来的两个失败:

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
Run Code Online (Sandbox Code Playgroud)

看看来源,Sinatra实际上并没有做任何事情[]; 它在Rack中实现为GET和的结合POST.然后POST 只返回表单哈希.因为GET它是查询哈希.在所有三条路线中,request.params都是空的.

我的问题:这是一个doc bug,还是我误解了如何使用request[]?目前,我的应用程序正在使用该env[]方法.但我想"做对".

Cas*_*per 11

似乎是文档中的错误.request[]实际上检索请求的参数,而不是标题:

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

def [](key)
  params[key.to_s]
end
Run Code Online (Sandbox Code Playgroud)

我也通过测试仔细检查了它.看起来有点傻,但看起来你真的不能以任何方式直接访问标题,除了通过env.至少我无法想出任何其他方式.

  • 我只是[在自述文件中为Sinatra打开了一个问题](https://github.com/sinatra/sinatra/issues/542). (2认同)

Gio*_*ino 7

我意识到如果标题中的参数是'SOME_HEADER'

我可以访问它

env['HTTP_SOME_HEADER']
Run Code Online (Sandbox Code Playgroud)

所以Sinatra(也许Rack)似乎添加了HTTP_前缀(和大写)...奇怪.