Запрос Sinatra [ "SOME_HEADER" ] не работает на POST; ошибка doc?

SINATRA README говорит:

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

Глядя на источник, Sinatra фактически ничего не делает с []; он реализован в Rack как объединение GET и POST. И POST просто возвращает хэш формы. Для GET это хеш запроса. Во всех трех маршрутах request.params пуст.

Мой вопрос: Является ли это ошибкой doc, или я не понимаю, как использовать request[]? На данный момент мое приложение отлично работает с методом env[]. Но я хочу сделать это "правильно".

Ответ 1

Кажется, это ошибка в документации. request[] действительно извлекает параметры для запроса, а не заголовок:

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

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

Я дважды проверил его, проверив также. Кажется немного глупым, но похоже, что вы действительно не можете напрямую обращаться к заголовку любым способом, кроме как через env. По крайней мере, я не мог понять другого пути.

Ответ 2

Я понял, что если заголовок param в 'SOME_HEADER'

Я могу получить к нему доступ с помощью

env['HTTP_SOME_HEADER']

поэтому Sinatra (возможно, Rack), похоже, добавляет префикс HTTP_ (и верхний регистр)... странно.

Ответ 3

Да, поскольку Джорджио сказал, что заголовок был заглавным и отформатирован так:

env['HTTP_SOME_HEADER']

с любыми дефисами, преобразованными в символы подчеркивания. Это довольно запутанно.