2010-02-06 2 views
13

내가 확인하고 싶습니다 :Ruby : URI가 HTTPS인지 확인하고 싶습니다. URI가 SSL 인증이 필요합니다 경우

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

덧붙여서,'OpenSSL :: SSL :: VERIFY_NONE'가 최선의 선택이 아닌 이유를 https://mislav.net/2013/07/ruby-openssl/가 설명합니다 –

답변

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 문자열에 대해 uri의 구성표를 확인할 수 있습니다.

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

클래스 계층을 변경할 확률은 기본적으로 같습니다 IMHO. 표준 라이브러리는 여전히 안정적입니다. 내가 문자열을 잘못 입력하면 ('http.use_ssl = (uri.scheme == 'htps')'), 나는 오류가 없으므로'instance_of? (URI :: HTTPS)'가 더 나은 선택이 될 수있다. (URI :: HTPS)''초기화되지 않은 상수' –

관련 문제