2010-06-01 8 views
2

J'ai un proxy Sinatra simple, qui, lorsqu'un endpoint est appelé, redirigera vers un autre point de terminaison sur le même proxy Sinatra.Sinatra ne passe pas l'en-tête avec la redirection

Lorsque je fais une requête avec un en-tête, le proxy ne semble pas passer cet en-tête à la deuxième extrémité lorsque la requête redirige dans le premier. Ceci est mon code:

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 

Tous les conseils seraient grandement appréciés.

Merci

Répondre

2

C'est intentionnellement. redirect déclenche une redirection HTTP, une nouvelle requête sera déclenchée. En outre, la transmission des valeurs env s'effectue via la modification env, et non response.

La question principale est, que voulez-vous dire par en-tête? Demande en-tête ou en-tête de réponse? De votre exemple, je veux dire que vous voulez dire l'en-tête de demande, donc response['username'] = username devrait être request.env['username'] = username. Vous pouvez ensuite remplacer redirect '/second' par request.path_info = '/second'; pass pour effectuer une sorte de redirection interne. Si vous ne transmettez pas la valeur à un autre middleware/point de terminaison Rack, vous pouvez également stocker le nom d'utilisateur dans une variable d'instance.

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

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

Merci Konstantin - c'était exactement ce que je cherchais. Je nettoyais oublié je pourrais utiliser la méthode de passe. À votre santé. – emson