2012-06-29 13 views
11

Die Sinatra README says:Sinatra Anfrage ["SOME_HEADER"] funktioniert nicht auf POST; doc Fehler?

request["SOME_HEADER"]  # value of SOME_HEADER header 

Angesichts dieser App:

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 

Die erste Spezifikation geht; die nächsten zwei fehlschlagen:

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 

an der Quelle der Suche, nicht Sinatra nicht wirklich etwas zu tun mit []; Es ist im Rack als die Union von GET und POST implementiert. Und POSTjust returns the form hash. Für GET ist es der Abfrage-Hash. In allen drei Routen ist request.params leer.

Meine Frage: Ist das ein doc-Fehler, oder verstehe ich nicht, wie man request[] verwendet? Im Moment funktioniert meine Anwendung gut mit der env[] Methode. Aber ich möchte es "richtig machen".

Antwort

11

Scheint ein Fehler in der Dokumentation zu sein. request[] ruft tatsächlich die params für die Anforderung, nicht der Header:

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

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

ich es auch durch Tests doppelt geprüft. Scheint ein bisschen albern, aber es sieht so aus, als ob man wirklich nicht direkt auf den Header zugreifen kann außer durch env. Zumindest konnte ich keinen anderen Weg finden.

+0

Ich denke, Sie haben Recht, da [die Rack-Quelle selbst scheint 'env'] (https://github.com/rack/rack/blob/master/lib/rack/request.rb#L308) –

+2

Ich habe gerade [ein Problem mit Sinatra für die README geöffnet] (https://github.com/sinatra/sinatra/issues/542). –

+0

Ja, siehe meine Antwort –

6

Ich erkennen, dass, wenn ein param in Header 'SOME_HEADER'

ich es mit

env['HTTP_SOME_HEADER'] 
zugreifen kann

so Sinatra (vielleicht Rack) scheint den HTTP_ Präfix hinzuzufügen (und großgeschrieben) ... seltsam.

0

Ja wie Giorgio sagte der Header aktiviert und war wie so formatiert:

umgewandelt
env['HTTP_SOME_HEADER'] 

mit irgendwelchen Bindestriche Unterstrichen. Was ziemlich verwirrend ist.

Verwandte Themen