2010-02-06 36 views
13

Tôi muốn kiểm tra xem URI sẽ cần chứng thực SSL:Ruby: Kiểm tra xem URI có phải là HTTPS không?

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 

Tuy nhiên, những vài dòng ném các lỗi sau ..

/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 

Tại sao nó xảy ra?

+0

Nhân tiện, https://mislav.net/2013/07/ruby-openssl/ giải thích tại sao «OpenSSL :: SSL :: VERIFY_NONE' không phải là lựa chọn tốt nhất –

Trả lời

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" 

Vì vậy, bạn có thể kiểm tra sơ đồ của uri dựa vào chuỗi "https" đơn giản.

8

như được hiển thị trong câu trả lời trước, HTTPHTTPS là các lớp khác nhau. cụ thể, HTTPS là lớp con của lớp HTTP. do đó bạn có thể kiểm tra với 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 

nhưng nếu phân cấp này bị thay đổi thì mã của bạn có thể bị hỏng, do đó câu trả lời ở trên có thể là minh chứng trong tương lai.

+0

Xác suất thay đổi cấu trúc phân cấp lớp về cơ bản là giống nhau như với phương thức 'scheme', IMHO. Thư viện chuẩn vẫn khá ổn định. 'instance_of? (URI :: HTTPS)' có thể là một lựa chọn tốt hơn vì nếu tôi nhập nhầm một chuỗi (nói 'http.use_ssl = (uri.scheme == 'htps')'), tôi không nhận được lỗi, trong khi 'instance_of? (URI :: HTPS) 'cung cấp' hằng số không khởi tạo' –

Các vấn đề liên quan