2014-09-04 51 views
5

我想訪問在sinatra中的過濾器中的標題。我的請求包含標題「HTTP_AUTH」,但我無法訪問它。我的過濾器是從Sinatra訪問標題

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

我在做什麼錯?

回答

8

嘗試使用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

+2

這會不會設置標題?我正在嘗試閱讀標題。 – 2014-09-04 09:13:08

+1

@JimJeffries你可以設置「標題」並閱讀「標題」。 – 2014-09-04 09:23:57

+1

讀取沒有參數的'headers'方法完成了這項工作。謝謝。 – 2014-09-04 09:40:40

17

我只是想補充一點,如果你使用headers它不會顯示自定義標題。例如,我設置了一個名爲X-CSRF-Token的自定義標題,我在每個AJAX請求上發送這個自定義標題,並且這個標題不會顯示在該標記中。如果您需要訪問自定義頁眉,你會發現他們通過request.env像:

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

(注意機架的變化X-CSRF令牌如何HTTP_X_CSRF_TOKEN)

+2

它爲什麼這樣做?感謝這個,我想知道我的標題去了哪裏 – 2017-09-04 03:30:41