Uri resolveUri(
Uri reference
)

Resolve reference as an URI relative to this.

Returns the resolved URI.

The algorithm for resolving a reference is described in RFC-3986 Section 5.

Source

/**
 * Resolve [reference] as an URI relative to `this`.
 *
 * Returns the resolved URI.
 *
 * The algorithm for resolving a reference is described in
 * [RFC-3986 Section 5]
 * (http://tools.ietf.org/html/rfc3986#section-5 "RFC-1123").
 */
Uri resolveUri(Uri reference) {
  // From RFC 3986.
  String targetScheme;
  String targetUserInfo = "";
  String targetHost;
  int targetPort;
  String targetPath;
  String targetQuery;
  if (reference.scheme.isNotEmpty) {
    targetScheme = reference.scheme;
    if (reference.hasAuthority) {
      targetUserInfo = reference.userInfo;
      targetHost = reference.host;
      targetPort = reference.hasPort ? reference.port : null;
    }
    targetPath = _removeDotSegments(reference.path);
    if (reference.hasQuery) {
      targetQuery = reference.query;
    }
  } else {
    targetScheme = this.scheme;
    if (reference.hasAuthority) {
      targetUserInfo = reference.userInfo;
      targetHost = reference.host;
      targetPort = _makePort(reference.hasPort ? reference.port : null,
                             targetScheme);
      targetPath = _removeDotSegments(reference.path);
      if (reference.hasQuery) targetQuery = reference.query;
    } else {
      if (reference.path == "") {
        targetPath = this._path;
        if (reference.hasQuery) {
          targetQuery = reference.query;
        } else {
          targetQuery = this._query;
        }
      } else {
        if (reference.path.startsWith("/")) {
          targetPath = _removeDotSegments(reference.path);
        } else {
          targetPath = _removeDotSegments(_merge(this._path, reference.path));
        }
        if (reference.hasQuery) targetQuery = reference.query;
      }
      targetUserInfo = this._userInfo;
      targetHost = this._host;
      targetPort = this._port;
    }
  }
  String fragment = reference.hasFragment ? reference.fragment : null;
  return new Uri._internal(targetScheme,
                           targetUserInfo,
                           targetHost,
                           targetPort,
                           targetPath,
                           targetQuery,
                           fragment);
}