2012-06-29 5 views
11

सिनात्रा README says:सिनात्रा अनुरोध ["SOME_HEADER"] POST पर काम नहीं करता है; डॉक्टर बग?

request["SOME_HEADER"]  # value of SOME_HEADER header 

इस एप्लिकेशन को देखते हुए:

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 

पहले कल्पना से गुजरता है; अगले दो असफल:

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 

स्रोत को देखते हुए, सिनात्रा वास्तव में [] साथ कुछ भी नहीं है; इसे रैक में GET और POST के संघ के रूप में लागू किया गया है। और POSTjust returns the form hashGET के लिए यह क्वेरी हैश है। सभी तीन मार्गों में, request.params खाली है।

मेरा प्रश्न: इस एक दस्तावेज़ बग है, या मैं गलत समझ रहा हूँ कैसे request[] उपयोग करने के लिए? अभी के लिए, मेरा आवेदन env[] विधि के साथ ठीक काम कर रहा है। लेकिन मैं इसे "सही" करना चाहता हूं।

उत्तर

11

प्रलेखन में एक बग लगता है। request[] वास्तव में, अनुरोध के लिए पैरामीटर को पुन: प्राप्त नहीं हैडर:

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

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

मैं डबल भी परीक्षण द्वारा यह जाँच। थोड़ा मूर्खतापूर्ण लगता है, लेकिन ऐसा लगता है कि env को छोड़कर आप वास्तव में किसी भी तरह से में हेडर तक सीधे पहुंच नहीं सकते हैं। कम से कम मैं किसी अन्य तरीके से पता नहीं लगा सका।

+0

मुझे लगता है कि आप सही हैं क्योंकि [रैक स्रोत स्वयं 'env'] का उपयोग करता है [https://github.com/rack/rack/blob/master/lib/rack/request.rb#L308) –

+2

मैंने अभी [रीडमे के लिए सिनात्रा के साथ एक मुद्दा खोला] [https://github.com/sinatra/sinatra/issues/542)। –

+0

हाँ, मेरा जवाब देखें –

6

मैंने महसूस किया कि यदि शीर्ष लेख में एक परम 'SOME_HEADER'

है मैं इसे

env['HTTP_SOME_HEADER'] 

तो सिनात्रा (शायद रैक) HTTP_ उपसर्ग (और uppercasing) जोड़ने के लिए लगता है के साथ उपयोग कर सकते हैं ... अजीब।

0

हाँ के रूप में जियोर्जियो कहा हैडर पूंजीकृत था और इसलिए इस तरह से प्रारूपित:

env['HTTP_SOME_HEADER'] 

किसी भी हाइफ़न के साथ अंडरस्कोर में बदला। जो बहुत भ्रमित है।

संबंधित मुद्दे