static bool mapToFile(MaConn *conn, bool *rescan) { MaRequest *req; MaResponse *resp; req = conn->request; resp = conn->response; if (resp->filename == 0) { resp->filename = makeFilename(conn, req->alias, req->url, 1); } req->dir = maLookupBestDir(req->host, resp->filename); if (req->dir == 0) { maFailRequest(conn, MPR_HTTP_CODE_NOT_FOUND, "Missing directory block for %s", resp->filename); return 0; } mprAssert(req->dir); req->auth = req->dir->auth; if (!resp->fileInfo.valid && mprGetFileInfo(conn, resp->filename, &resp->fileInfo) < 0) { #if UNUSED if (req->method & (MA_REQ_GET | MA_REQ_POST)) { maFailRequest(conn, MPR_HTTP_CODE_NOT_FOUND, "Can't open document: %s", resp->filename); return 0; } #endif } if (resp->fileInfo.isDir) { processDirectory(conn, rescan); } return 1; }
int maSetRequestUri(MaConn *conn, cchar *uri, cchar *query) { MaRequest *req; MaResponse *resp; MaHost *host; MprUri *prior; char *cp; if (uri == 0 || *uri == 0) { uri = "/"; } host = conn->host; req = conn->request; resp = conn->response; prior = req->parsedUri; if ((req->parsedUri = mprParseUri(req, uri)) == 0) { return MPR_ERR_BAD_ARGS; } if (prior) { if ((cp = strstr(uri, "://")) == 0) { req->parsedUri->scheme = prior->scheme; req->parsedUri->host = prior->host; } else if (strchr(&cp[3], ':') == 0) { req->parsedUri->port = prior->port; } } if (query == 0 && prior) { req->parsedUri->query = prior->query; } else if (*query) { req->parsedUri->query = mprStrdup(req->parsedUri, query); } req->url = mprValidateUrl(req, mprUrlDecode(req, req->parsedUri->url)); req->alias = maGetAlias(host, req->url); resp->filename = maMakeFilename(conn, req->alias, req->url, 1); if ((req->dir = maLookupBestDir(req->host, resp->filename)) != 0) { if (req->dir->auth) { req->auth = req->dir->auth; } } req->location = maLookupBestLocation(host, req->url); if (req->auth == 0) { req->auth = req->location->auth; } mprGetPathInfo(conn, resp->filename, &resp->fileInfo); resp->extension = maGetExtension(conn); if ((resp->mimeType = (char*) maLookupMimeType(host, resp->extension)) == 0) { resp->mimeType = (char*) "text/html"; } return 0; }
/* * Create an ejs application location block and alias */ static void createEjsAlias(Mpr *mpr, MaHttp *http, MaServer *server, cchar *ejsPrefix, cchar *ejsPath) { MaAlias *alias; MaHost *host; MaDir *dir, *parent; MaLocation *location; int flags; host = server->defaultHost; flags = host->location->flags & (MA_LOC_BROWSER | MA_LOC_AUTO_SESSION); alias = maCreateAlias(host, ejsPrefix, ejsPath, 0); maInsertAlias(host, alias); mprLog(http, 4, "Alias \"%s\" for \"%s\"", ejsPrefix, ejsPath); if (maLookupLocation(host, ejsPrefix)) { mprError(http, "Location block already exists for \"%s\"", ejsPrefix); return; } location = maCreateLocation(host, host->location); maSetLocationAuth(location, host->location->auth); maSetLocationPrefix(location, ejsPrefix); maAddLocation(host, location); maSetLocationFlags(location, MA_LOC_APP | flags); maSetHandler(http, host, location, "ejsHandler"); #if BLD_FEATURE_UPLOAD /* Upload configuration */ location->autoDelete = 1; if (maAddFilter(http, location, "chunkFilter", "", MA_FILTER_INCOMING) < 0) { mprError(server, "Can't add chunkFilter for ejs"); } if (maAddFilter(http, location, "uploadFilter", "", MA_FILTER_INCOMING) < 0) { mprError(server, "Can't add uploadFilter for ejs"); } #endif /* * Make sure there is a directory for the alias target */ dir = maLookupBestDir(host, ejsPath); if (dir == 0) { parent = mprGetFirstItem(host->dirs); dir = maCreateDir(host, alias->filename, parent); maInsertDir(host, dir); } }