从Sinatra访问标题

时间:2014-09-04 08:34:46

标签: ruby http-headers sinatra

我正在尝试访问sinatra中的过滤器中的标头。我的请求包括标题" HTTP_AUTH"但是我无法访问它。我的过滤器是

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

它可以从我的机架测试中正常工作。

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

但是当我从其他来源尝试时,我无法访问它。如果我puts request.env我可以看到令牌在请求中,但我无法访问它。

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

我做错了什么?

2 个答案:

答案 0 :(得分:28)

我只想补充一点,如果您使用headers,则不会显示自定义标头。例如,我设置了一个名为X-CSRF-Token的自定义标头,我在每个AJAX请求中发送该标头,并且这个标头不会显示在该哈希中。如果您需要访问自定义标头,可以通过request.env找到它们,如:

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

(注意架子如何将X-CSRF-Token更改为HTTP_X_CSRF_TOKEN)

答案 1 :(得分:10)

尝试使用before方法使用headers块:

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

或在请求中:

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

使用headers只是hash