2019-12-13 06:19:08 -05:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
##
|
|
|
|
# The UriParser handles parsing URIs.
|
|
|
|
#
|
|
|
|
|
|
|
|
class Gem::UriParser
|
2021-07-07 01:07:29 -04:00
|
|
|
def self.parse_uri(source_uri)
|
|
|
|
return source_uri unless source_uri.is_a?(String)
|
|
|
|
|
|
|
|
new.parse(source_uri)
|
|
|
|
end
|
|
|
|
|
2019-12-13 06:19:08 -05:00
|
|
|
##
|
|
|
|
# Parses the #uri, raising if it's invalid
|
|
|
|
|
|
|
|
def parse!(uri)
|
2021-07-07 01:07:29 -04:00
|
|
|
require "uri"
|
|
|
|
|
2019-12-13 06:19:08 -05:00
|
|
|
raise URI::InvalidURIError unless uri
|
|
|
|
|
|
|
|
# Always escape URI's to deal with potential spaces and such
|
|
|
|
# It should also be considered that source_uri may already be
|
|
|
|
# a valid URI with escaped characters. e.g. "{DESede}" is encoded
|
|
|
|
# as "%7BDESede%7D". If this is escaped again the percentage
|
|
|
|
# symbols will be escaped.
|
|
|
|
begin
|
|
|
|
URI.parse(uri)
|
|
|
|
rescue URI::InvalidURIError
|
|
|
|
URI.parse(URI::DEFAULT_PARSER.escape(uri))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
##
|
|
|
|
# Parses the #uri, returning the original uri if it's invalid
|
|
|
|
|
|
|
|
def parse(uri)
|
|
|
|
parse!(uri)
|
|
|
|
rescue URI::InvalidURIError
|
|
|
|
uri
|
|
|
|
end
|
|
|
|
end
|