2011-06-11 14 views

Respuesta

34

Las cabeceras HTTP están disponibles en el Rack environment pasado a su aplicación:

HTTP_ Variables: Las variables correspondientes a las cabeceras de petición HTTP proporcionados por el cliente (es decir, variables cuyos nombres comienzan con HTTP_). La presencia o ausencia de estas variables debe corresponder con la presencia o ausencia del encabezado HTTP apropiado en la solicitud.

Así las cabeceras HTTP tienen el prefijo "HTTP_" y ha añadido que el hash.

aquí hay un pequeño programa que extrae y los muestra:

require 'rack' 

app = Proc.new do |env| 
    headers = env.select {|k,v| k.start_with? 'HTTP_'} 
    .collect {|key, val| [key.sub(/^HTTP_/, ''), val]} 
    .collect {|key, val| "#{key}: #{val}<br>"} 
    .sort 
    [200, {'Content-Type' => 'text/html'}, headers] 
end 

Rack::Server.start :app => app, :Port => 8080 

Cuando ejecuto esto, además de las cabeceras HTTP como se muestra por Chrome o Firefox, no es una "versión: HTPP/1.1" (es decir, se está agregando una entrada con la clave "HTTP_VERSION" y el valor "HTTP/1.1" al hash de env).

+2

Ah, entonces básicamente es 'env' :). Lo que no me gusta son los nombres con algunos caracteres reemplazados. Bueno, supongo que tendré que salirme con la tuya ... – PJK

+0

@PJK, así que los nombres deberían ser insensibles de todos modos: http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4. 2. ¿Qué personajes están siendo reemplazados? ¿Estás tratando de usar caracteres desde fuera del conjunto de caracteres ASCII? Los nombres de encabezado deben ser solo ASCII. – matt

+2

Lo sé, es solo una cuestión de conveniencia ... Por ejemplo, X-Build se convierte en HTTP_X_BUILD, lo que significa que X_Build y X-BUILD deberían ser equivalentes, pero (me han dicho que) los navegadores diferencian estas dos alternativas. – PJK

4

Sobre la base de la respuesta de @ mate, pero esto realmente le da las cabeceras de petición en un hash como se pide en la pregunta:

headers = Hash[*env.select {|k,v| k.start_with? 'HTTP_'} 
    .collect {|k,v| [k.sub(/^HTTP_/, ''), v]} 
    .collect {|k,v| [k.split('_').collect(&:capitalize).join('-'), v]} 
    .sort 
    .flatten] 

Dependiendo de qué convención clave prefiere puede que quiera usar otra cosa en lugar de :capitalizar.

Cuestiones relacionadas