2010-06-01 53 views
2

我有一個簡單的Sinatra代理,當一個端點被調用時,它將重定向到同一個Sinatra代理上的另一個端點。Sinatra不通過標題與重定向

當我使用頭進行請求時,當請求在第一個端點重定向時,代理似乎不會將此頭傳遞給第二個端點。這是我的代碼:

get '/first' do 
     # get the header from the request 
     username = env['HTTP_USERNAME'] 
     # set the header for the response 
     response['username'] = username 
     redirect '/second' 
    end 

    get '/second' do 
     # This doesn't exist when redirected from /first 
    puts env['HTTP_USERNAME'] 

     # Here is a list of all headers 
     env.each_key do |key| 
     puts "KEY: #{key} VALUE: #{env[key]}" unless key.nil? 
     end 

     "DONE" 
    end 

任何提示將不勝感激。

謝謝

回答

2

這是故意的。 redirect觸發一個HTTP重定向,一個新的請求將被觸發。此外,傳遞env的值是通過修改env而不是response完成的。

主要問題是,您的頭是什麼意思?請求標頭或響應標頭?從你的例子我想你的意思是請求標題,因此response['username'] = username應該是request.env['username'] = username。然後,您可以用request.path_info = '/second'; pass替換redirect '/second'來執行某種內部重定向。如果您沒有將該值傳遞給另一個Rack中間件/端點,則還可以將用戶名存儲在實例變量中。

get '/first' do 
    request.path_info = '/second' 
    pass 
end 

get '/second' do 
    puts request.env['HTTP_USERNAME'] 
    "DONE" 
end 
+0

謝謝康斯坦丁 - 那正是我一直在尋找的。我清理忘了我可以使用pass方法。乾杯。 – emson 2010-06-07 13:05:36