2010-02-06 17 views
13

me gustaría comprobar si el URI necesitará autenticación SSL:Ruby: comprobar si URI es 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 

Sin embargo, esas pocas líneas arrojan el siguiente error ..

/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 

¿Por qué está sucediendo?

+0

Por cierto, https://mislav.net/2013/07/ruby-openssl/ explica por qué 'OpenSSL :: SSL :: VERIFY_NONE' no es la mejor opción –

Respuesta

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" 

Para que pueda verificar el esquema de uri contra cadena simple "https".

8

como se muestra en la respuesta anterior, HTTP y HTTPS son clases diferentes. en particular, HTTPS es una subclase de la clase HTTP. por lo tanto, puede consultar con 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 

pero si esta jerarquía siempre se cambia, entonces su código podría romper, por lo tanto la respuesta anterior podría ser más a prueba de futuro.

+0

La probabilidad de cambiar la jerarquía de clases es básicamente la misma como con el método 'scheme', en mi humilde opinión. La biblioteca estándar sigue siendo bastante estable. 'instance_of? (URI :: HTTPS)' puede ser una mejor opción ya que si escribo mal una cadena (digamos 'http.use_ssl = (uri.scheme == 'htps')'), no obtengo ningún error, mientras que 'instance_of? (URI :: HTPS) 'da' constante no inicializada –

Cuestiones relacionadas