2012-06-29 3 views
11

El Sinatra README says:La solicitud de Sinatra ["SOME_HEADER"] no funciona en POST; doc bug?

request["SOME_HEADER"]  # value of SOME_HEADER header 

Dada esta aplicación:

require 'sinatra' 

post '/env' do 
    env['HTTP_X_FOO'] 
end 

post '/request' do 
    request['X-Foo'] 
end 

post '/request_rack_http_format' do 
    request['HTTP_X_FOO'] 
end 

pasa la primera especificación; fallan los dos siguientes:

describe "Sinatra should place the header in" do 
    before(:all) do 
     header 'X-Foo', 'Bar' 
    end 

    example "env" do 
     post '/env' 
     last_response.body.should == 'Bar' #pass 
    end 

    example "request[]" do 
     post '/request' 
     last_response.body.should == 'Bar' #fail; got "" 
    end 

    example "request[] (rack format)" do 
     post '/request_rack_http_format' 
     last_response.body.should == 'Bar' #fail; got "" 
    end 
end 

En cuanto a la fuente, Sinatra no hace nada con []; se implementa en Rack como la unión de GET y POST. Y POSTjust returns the form hash. Para GET, es el hash de consulta. En las tres rutas, request.params está vacío.

Mi pregunta es: ¿Este es un error de doc, o no entiendo cómo usar request[]? Por ahora, mi aplicación está funcionando bien con el método env[]. Pero quiero hacerlo "bien".

Respuesta

11

Parece ser un error en la documentación. request[] realmente lo recupere los parametros para la solicitud, no el encabezado:

https://github.com/rack/rack/blob/master/lib/rack/request.rb#L262

def [](key) 
    params[key.to_s] 
end 

Me doble comprobado que mediante pruebas también. Parece un poco tonto, pero parece que realmente no se puede acceder directamente al encabezado de ninguna manera , excepto a través de env. Al menos no pude entender de otra manera.

+0

Creo que tienes razón, ya que [la fuente de Rack en sí misma parece usar 'env'] (https://github.com/rack/rack/blob/master/lib/rack/request.rb#L308) –

+2

Acabo de [abrir un problema con Sinatra para el archivo README] (https://github.com/sinatra/sinatra/issues/542). –

+0

sí, mira mi respuesta –

6

me di cuenta de que si un parámetro en la cabecera es 'SOME_HEADER'

puedo acceder a ella con

env['HTTP_SOME_HEADER'] 

modo Sinatra (tal vez en rack) parece añadir el HTTP_ prefijo (y uppercasing) ... extraño.

0

Sí como Giorgio dijo la cabecera fue capitalizada y formateado de este modo:

env['HTTP_SOME_HEADER'] 

con cualquier guiones convertidos en guiones. Lo cual es bastante confuso

Cuestiones relacionadas