The Sinatra README says:
request["SOME_HEADER"] # value of SOME_HEADER header
Given this app:
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
The first spec passes; the next two fail:
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
Looking at the source, Sinatra doesn't actually do anything with []
; it's implemented in Rack as the union of GET
and POST
. And POST
just returns the form hash. For GET
it's the query hash. In all three routes, request.params
is empty.
My question: Is this a doc bug, or am I misunderstanding how to use request[]
? For now, my application is working fine with the env[]
method. But I want to do it "right."
Seems to be a bug in the documentation. request[]
actually retrieves the params for the request, not the header:
https://github.com/rack/rack/blob/master/lib/rack/request.rb#L262
def [](key)
params[key.to_s]
end
I double checked it by testing also. Seems a bit silly, but it looks like you really can't directly access the header in any way except through env
. At least I could not figure out any other way.
I realized that if a param in header is 'SOME_HEADER'
I can access it with
env['HTTP_SOME_HEADER']
so Sinatra (maybe Rack) seems to add the HTTP_ prefix (and uppercasing)... strange.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With