Method: Addressable::URI.heuristic_parse

Defined in:
lib/vendor/addressable/lib/addressable/uri.rb

.heuristic_parse(uri, hints = {}) ⇒ Addressable::URI

Converts an input to a URI. The input does not have to be a valid URI — the method will use heuristics to guess what URI was intended. This is not standards-compliant, merely user-friendly.

No parsing is performed if the object is already an Addressable::URI. Defaults to {:scheme => "http"}.

Parameters:

Returns:



140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
# File 'lib/vendor/addressable/lib/addressable/uri.rb', line 140

def self.heuristic_parse(uri, hints={})
  # If we were given nil, return nil.
  return nil unless uri
  # If a URI object is passed, just return itself.
  return uri if uri.kind_of?(self)
  if !uri.respond_to?(:to_str)
    raise TypeError, "Can't convert #{uri.class} into String."
  end
  # Otherwise, convert to a String
  uri = uri.to_str.dup
  hints = {
    :scheme => "http"
  }.merge(hints)
  case uri
  when /^http:\/+/
    uri.gsub!(/^http:\/+/, "http://")
  when /^feed:\/+http:\/+/
    uri.gsub!(/^feed:\/+http:\/+/, "feed:http://")
  when /^feed:\/+/
    uri.gsub!(/^feed:\/+/, "feed://")
  when /^file:\/+/
    uri.gsub!(/^file:\/+/, "file:///")
  end
  parsed = self.parse(uri)
  if parsed.scheme =~ /^[^\/?#\.]+\.[^\/?#]+$/
    parsed = self.parse(hints[:scheme] + "://" + uri)
  end
  if parsed.path.include?(".")
    new_host = parsed.path[/^([^\/]+\.[^\/]*)/, 1]
    if new_host
      parsed.defer_validation do
        new_path = parsed.path.gsub(
          Regexp.new("^" + Regexp.escape(new_host)), "")
        parsed.host = new_host
        parsed.path = new_path
        parsed.scheme = hints[:scheme] unless parsed.scheme
      end
    end
  end
  return parsed
end