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);
}