PUBLIC HttpUri *httpResolveUri(HttpConn *conn, HttpUri *base, HttpUri *other) { HttpHost *host; HttpEndpoint *endpoint; HttpUri *current; if (!base || !base->valid) { return other; } if (!other || !other->valid) { return base; } current = httpCloneUri(base, 0); /* Must not inherit the query or reference */ current->query = 0; current->reference = 0; if (other->scheme && !smatch(current->scheme, other->scheme)) { current->scheme = sclone(other->scheme); /* If the scheme is changed (test above), then accept an explict port. If no port, then must not use the current port as the scheme has changed. */ if (other->port) { current->port = other->port; } else { host = conn ? conn->host : httpGetDefaultHost(); endpoint = smatch(current->scheme, "https") ? host->secureEndpoint : host->defaultEndpoint; if (endpoint) { current->port = endpoint->port; } else { current->port = 0; } } } if (other->host) { current->host = sclone(other->host); } if (other->port) { current->port = other->port; } if (other->path) { trimPathToDirname(current); httpJoinUriPath(current, current, other); current->path = httpNormalizeUriPath(current->path); } if (other->reference) { current->reference = sclone(other->reference); } if (other->query) { current->query = sclone(other->query); } current->ext = mprGetPathExt(current->path); return current; }
PUBLIC HttpUri *httpResolveUri(HttpUri *base, int argc, HttpUri **others, bool local) { HttpUri *current, *other; int i; if ((current = httpCloneUri(base, 0)) == 0) { return 0; } if (local) { current->host = 0; current->scheme = 0; current->port = 0; } /* Must not inherit the query or reference */ current->query = 0; current->reference = 0; for (i = 0; i < argc; i++) { other = others[i]; if (other->scheme && !smatch(current->scheme, other->scheme)) { current->scheme = sclone(other->scheme); /* If the scheme is changed (test above), then accept an explict port. If no port, then must not use the current port as the scheme has changed. */ if (other->port) { current->port = other->port; } else if (current->port) { current->port = 0; } } if (other->host) { current->host = sclone(other->host); } if (other->port) { current->port = other->port; } if (other->path) { trimPathToDirname(current); httpJoinUriPath(current, current, other); } if (other->reference) { current->reference = sclone(other->reference); } if (other->query) { current->query = sclone(other->query); } } current->ext = mprGetPathExt(current->path); return current; }