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; }
/* Create a new server. A server may manage may multiple servers and virtual hosts. If ip/port endpoint is supplied, this call will create a Server on that endpoint. Otherwise, maConfigureServer should be called later. A default route is created with the document root set to "." */ PUBLIC MaServer *maCreateServer(MaAppweb *appweb, cchar *name) { MaServer *server; HttpHost *host; HttpRoute *route; assert(appweb); if ((server = mprAllocObj(MaServer, manageServer)) == NULL) { return 0; } if (name == 0 || *name == '\0') { name = "default"; } server->name = sclone(name); server->endpoints = mprCreateList(-1, 0); server->limits = httpCreateLimits(1); server->appweb = appweb; server->http = appweb->http; server->defaultHost = host = httpCreateHost(NULL); if (!httpGetDefaultHost()) { httpSetDefaultHost(host); } route = httpCreateRoute(host); httpSetRouteName(route, "default"); //UNUSED httpSetRoutePrefix(route, ""); httpSetHostDefaultRoute(host, route); route->limits = server->limits; maAddServer(appweb, server); if (appweb->defaultServer == 0) { maSetDefaultServer(appweb, server); } return server; }