2010-02-06 34 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'不是最佳选择 – 2018-01-27 14:34:15

回答

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

如前面的答案所示,HTTPHTTPS是不同的类。 特别是,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

更改类层次结构的概率基本相同与'scheme'方法一样,恕我直言。标准库仍然相当稳定。 ''instance_of?(URI :: HTTPS)''可以是一个更好的选择,因为如果我错误地输入了一个字符串(比如'http.use_ssl =(uri.scheme =='htps')'),我就没有错误,而'instance_of? (URI :: HTPS)'给出'未初始化的常量' – 2018-01-27 14:31:20