URI URI::resolve(const URI& relative) const { URI target; if (relative._scheme) { target._scheme = relative._scheme; target._authority = relative._authority; target._path = removeDotSegments(relative._path); target._query = relative._query; } else { if (relative._authority) { target._authority = relative._authority; target._path = removeDotSegments(relative._path); target._query = relative._query; } else { if (relative._path.empty()) { target._path = _path; if (relative._query) { target._query = relative._query; } else { target._query = _query; } } else { // Safe to check first character // because already checked not empty if (relative._path[0] == '/') { target._path = removeDotSegments(relative._path); } else { target._path = removeDotSegments(merge(*this, relative)); } target._query = relative._query; } target._authority = _authority; } target._scheme = _scheme; } target._fragment = relative._fragment; return target; }
void URI::resolve(const URI& relativeURI) { if (!relativeURI._scheme.empty()) { _scheme = relativeURI._scheme; _userInfo = relativeURI._userInfo; _host = relativeURI._host; _port = relativeURI._port; _path = relativeURI._path; _query = relativeURI._query; removeDotSegments(); } else { if (!relativeURI._host.empty()) { _userInfo = relativeURI._userInfo; _host = relativeURI._host; _port = relativeURI._port; _path = relativeURI._path; _query = relativeURI._query; removeDotSegments(); } else { if (relativeURI._path.empty()) { if (!relativeURI._query.empty()) _query = relativeURI._query; } else { if (relativeURI._path[0] == '/') { _path = relativeURI._path; removeDotSegments(); } else { mergePath(relativeURI._path); } _query = relativeURI._query; } } } _fragment = relativeURI._fragment; }
void URI::normalize() { removeDotSegments(!isRelative()); }