2010-02-06 1 views
13

Я хотел бы проверить, если URI потребуется SSL аутентификации:Ruby: Проверьте, является ли URI 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/ объясняет, почему «OpenSSL :: SSL :: 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" 

Таким образом, вы можете проверить схему uri на простую строку «https».

8

, как показано в предыдущем ответе, HTTP и HTTPS - это разные классы. в частности, HTTPS является подклассом класса HTTP. таким образом, вы можете проверить с помощью 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

Вероятность изменения иерархии классов в основном одинакова как с методом 'schem', ИМХО. Стандартная библиотека по-прежнему довольно стабильна. 'instance_of? (URI :: HTTPS)' может быть лучшим выбором, поскольку, если я ошибочно ошибаюсь в строке (например, 'http.use_ssl = (uri.scheme == 'htps')'), я не получаю ошибки, тогда как 'instance_of? (URI :: HTPS) 'дает' uninitialized constant' –