2010-02-06 5 views
13

मैं अगर यूआरआई एसएसएल प्रमाणीकरण की आवश्यकता होगी जांच करने के लिए करना चाहते हैं:रूबी: जांच कर रहा है कि यूआरआई HTTPS है या नहीं?

url = URI.parse("http://www.google.com") 

# [some code] 

if url.instance_of? URI::HTTPS 
    http.use_ssl=true 
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE 
end 

हालांकि, उन कुछ लाइनों फेंक निम्न त्रुटि ..

/usr/lib/ruby/1.8/uri/common.rb:436:in `split': bad URI(is not URI?): HTTPS (URI::InvalidURIError) 
    from /usr/lib/ruby/1.8/uri/common.rb:485:in `parse' 
    from /usr/lib/ruby/1.8/uri/common.rb:608:in `URI' 
    from links.rb:18 

क्यों हो रहा है?

+0

वैसे, https://mislav.net/2013/07/ruby-openssl/ बताता है कि क्यों 'ओपनएसएसएल :: एसएसएल :: VERIFY_NONE' सबसे अच्छा विकल्प नहीं है –

उत्तर

20
>> uri = URI.parse("http://www.google.com") 
=> #<URI::HTTP:0x1014ca458 URL:http://www.google.com> 
>> uri.scheme 
=> "http" 
>> uri = URI.parse("https://mail.google.com") 
=> #<URI::HTTPS:0x1014c2e60 URL:https://mail.google.com> 
>> uri.scheme 
=> "https" 

तो आप सरल "https" स्ट्रिंग के खिलाफ यूरी की योजना की जांच कर सकते हैं।

8

जैसा कि पिछले उत्तर में दिखाया गया है, HTTP और HTTPS विभिन्न कक्षाएं हैं। विशेष रूप से , HTTPSHTTP कक्षा का उप-वर्ग है। इस प्रकार आप instance_of? के साथ जांच सकते हैं।

http = URI.parse "http://example.com" 
https = URI.parse "https://example.com" 

http.instance_of? URI::HTTPS #=> false 
https.instance_of? URI::HTTPS #=> true 

लेकिन अगर इस पदानुक्रम में कभी भी परिवर्तन हो जाता है, तो अपने कोड, को तोड़ सकते थे इस प्रकार ऊपर जवाब भविष्य के लिए अधिक सबूत हो सकता है।

+0

कक्षा पदानुक्रम बदलने की संभावना मूल रूप से वही है 'योजना 'विधि के साथ, आईएमएचओ। मानक पुस्तकालय अभी भी काफी स्थिर है। 'instance_of? (यूआरआई :: HTTPS) 'यदि मैं एक स्ट्रिंग को गलत टाइप करता हूं (' http.use_ssl = (uri.scheme == 'htps') कहें, तो मुझे बेहतर विकल्प हो सकता है, मुझे कोई त्रुटि नहीं मिलती है, जबकि' instance_of? (यूआरआई :: एचटीपीएस) '' अनियमित स्थिर 'देता है –