web-dev-qa-db-ja.com

シナトラからヘッダーにアクセスする

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", 

私は何が間違っているのですか?

11
Jim Jeffries

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 with is just hashを使用します

12
Зелёный

headersを使用すると、カスタムヘッダーが表示されないことを追加したかっただけです。たとえば、すべてのAJAXリクエストで送信するX-CSRF-Tokenという名前のカスタムヘッダーを設定しましたが、これはそのハッシュに表示されません。カスタムにアクセスする必要がある場合ヘッダーは、次のようにrequest.envで見つけることができます。

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

(ラックがX-CSRF-TokenをHTTP_X_CSRF_TOKENに変更する方法に注意してください)