Accessing headers from Sinatra

2020-06-03 02:36发布

问题:

I am trying to access the headers in a filter in sinatra. My request includes the header "HTTP_AUTH", however I can't access it. My filter is

before do
    halt 403 unless request['HTTP_AUTH'] == 'test'
end

It works correctly from my rack test.

browser.get '/mypath', "CONTENT_TYPE" => "application/json", "HTTP_AUTH" => 'test'

But when I try from other sources I can't access it. If I puts request.env I can see the token is in the request, but I can't access it.

"HTTP_CONNECTION"=>"close", 
"HTTP_AUTH"=>"test", 
"HTTP_ACCEPT"=>"application/json", 

What am I doing wrong?

回答1:

Try use before block with headers method:

before do
  headers "HTTP_AUTH" => "test"
  headers "Content-Type" => "text/html; charset=utf-8"
end

or in request:

get '/' do
  headers['HTTP_AUTH'] = "test"
  headers['Cache-Control'] = 'public, max-age=600'
  puts headers # show headers on this request
end

Use headers with is just hash



回答2:

I just wanted to add that if you use headers it will not show custom headers. For example, I set up a custom header named X-CSRF-Token which I send on every AJAX request, and this one won't show up in that hash. If you need to access custom headers, you will find them through request.env like:

post '/' do
  header_token = request.env["HTTP_X_CSRF_TOKEN"]
end

(Notice how rack changes X-CSRF-Token to HTTP_X_CSRF_TOKEN)