lib/json-schema/util/uri.rb in json-schema-2.5.2 vs lib/json-schema/util/uri.rb in json-schema-2.6.0
- old
+ new
@@ -1,16 +1,64 @@
+require 'addressable/uri'
+
module JSON
module Util
module URI
- def self.normalized_uri(uri)
- uri = Addressable::URI.parse(uri) unless uri.is_a?(Addressable::URI)
- # Check for absolute path
- if uri.relative?
- data = uri.to_s
- data = "#{Dir.pwd}/#{data}" if data[0,1] != '/'
- uri = Addressable::URI.convert_path(data)
+ SUPPORTED_PROTOCOLS = %w(http https ftp tftp sftp ssh svn+ssh telnet nntp gopher wais ldap prospero)
+
+ def self.normalized_uri(uri, base_path = Dir.pwd)
+ @normalize_cache ||= {}
+ normalized_uri = @normalize_cache[uri]
+
+ if !normalized_uri
+ normalized_uri = parse(uri)
+ # Check for absolute path
+ if normalized_uri.relative?
+ data = normalized_uri
+ data = File.join(base_path, data) if data.path[0,1] != "/"
+ normalized_uri = file_uri(data)
+ end
+ @normalize_cache[uri] = normalized_uri.freeze
end
- uri
+
+ normalized_uri
+ end
+
+ def self.parse(uri)
+ if uri.is_a?(Addressable::URI)
+ return uri.dup
+ else
+ @parse_cache ||= {}
+ parsed_uri = @parse_cache[uri]
+ if parsed_uri
+ parsed_uri.dup
+ else
+ @parse_cache[uri] = Addressable::URI.parse(uri)
+ end
+ end
+ rescue Addressable::URI::InvalidURIError => e
+ raise JSON::Schema::UriError.new(e.message)
+ end
+
+ def self.strip_fragment(uri)
+ parsed_uri = parse(uri)
+ if parsed_uri.fragment.nil? || parsed_uri.fragment.empty?
+ parsed_uri
+ else
+ parsed_uri.merge(:fragment => "")
+ end
+ end
+
+ def self.file_uri(uri)
+ parsed_uri = parse(uri)
+
+ Addressable::URI.convert_path(parsed_uri.path)
+ end
+
+ def self.unescaped_uri(uri)
+ parsed_uri = parse(uri)
+
+ Addressable::URI.unescape(parsed_uri.path)
end
end
end
end