File: uri.rb

package info (click to toggle)
ruby-json-schema 2.8.1-4
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 896 kB
  • sloc: ruby: 5,806; makefile: 6
file content (110 lines) | stat: -rw-r--r-- 2,840 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
require 'addressable/uri'

module JSON
  module Util
    module URI
      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

        normalized_uri
      end

      def self.absolutize_ref(ref, base)
        ref_uri = strip_fragment(ref.dup)

        return ref_uri if ref_uri.absolute?
        return parse(base) if ref_uri.path.empty?

        uri = strip_fragment(base.dup).join(ref_uri.path)
        normalized_uri(uri)
      end

      def self.normalize_ref(ref, base)
        ref_uri = parse(ref)
        base_uri = parse(base)

        ref_uri.defer_validation do
          if ref_uri.relative?
            ref_uri.merge!(base_uri)

            # Check for absolute path
            path, fragment = ref.to_s.split("#")
            if path.nil? || path == ''
              ref_uri.path = base_uri.path
            elsif path[0,1] == "/"
              ref_uri.path = Pathname.new(path).cleanpath.to_s
            else
              ref_uri.join!(path)
            end

            ref_uri.fragment = fragment
          end

          ref_uri.fragment = "" if ref_uri.fragment.nil? || ref_uri.fragment.empty?
        end

        ref_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.unescape_uri(uri)
        Addressable::URI.unescape(uri)
      end

      def self.unescaped_path(uri)
        parsed_uri = parse(uri)

        Addressable::URI.unescape(parsed_uri.path)
      end

      def self.clear_cache
        @parse_cache = {}
        @normalize_cache = {}
      end
    end
  end
end