class Addressable::URI

def route_from(uri)

Returns:
  • (Addressable::URI) -

Parameters:
  • uri (String, Addressable::URI, #to_str) -- The URI to route from.
def route_from(uri)
  uri = URI.parse(uri).normalize
  normalized_self = self.normalize
  if normalized_self.relative?
    raise ArgumentError, "Expected absolute URI, got: #{self.to_s}"
  end
  if uri.relative?
    raise ArgumentError, "Expected absolute URI, got: #{uri.to_s}"
  end
  if normalized_self == uri
    return Addressable::URI.parse("##{normalized_self.fragment}")
  end
  components = normalized_self.to_hash
  if normalized_self.scheme == uri.scheme
    components[:scheme] = nil
    if normalized_self.authority == uri.authority
      components[:user] = nil
      components[:password] = nil
      components[:host] = nil
      components[:port] = nil
      if normalized_self.path == uri.path
        components[:path] = nil
        if normalized_self.query == uri.query
          components[:query] = nil
        end
      else
        if uri.path != SLASH and components[:path]
          self_splitted_path = split_path(components[:path])
          uri_splitted_path = split_path(uri.path)
          self_dir = self_splitted_path.shift
          uri_dir = uri_splitted_path.shift
          while !self_splitted_path.empty? && !uri_splitted_path.empty? and self_dir == uri_dir
            self_dir = self_splitted_path.shift
            uri_dir = uri_splitted_path.shift
          end
          components[:path] = (uri_splitted_path.fill('..') + [self_dir] + self_splitted_path).join(SLASH)
        end
      end
    end
  end
  # Avoid network-path references.
  if components[:host] != nil
    components[:scheme] = normalized_self.scheme
  end
  return Addressable::URI.new(
    :scheme => components[:scheme],
    :user => components[:user],
    :password => components[:password],
    :host => components[:host],
    :port => components[:port],
    :path => components[:path],
    :query => components[:query],
    :fragment => components[:fragment]
  )
end