static int parseCgi(MaHttp *http, cchar *key, char *value, MaConfigState *state) { MaLocation *location; MaServer *server; MaHost *host; MaAlias *alias; MaDir *dir, *parent; char *program, *mimeType, *prefix, *path; host = state->host; server = state->server; location = state->location; if (mprStrcmpAnyCase(key, "Action") == 0) { if (maSplitConfigValue(http, &mimeType, &program, value, 1) < 0) { return MPR_ERR_BAD_SYNTAX; } maSetMimeActionProgram(host, mimeType, program); return 1; } else if (mprStrcmpAnyCase(key, "ScriptAlias") == 0) { if (maSplitConfigValue(server, &prefix, &path, value, 1) < 0 || path == 0 || prefix == 0) { return MPR_ERR_BAD_SYNTAX; } /* Create an alias and location with a cgiHandler and pathInfo processing */ path = maMakePath(host, path); dir = maLookupDir(host, path); if (maLookupDir(host, path) == 0) { parent = mprGetFirstItem(host->dirs); dir = maCreateDir(host, path, parent); } alias = maCreateAlias(host, prefix, path, 0); mprLog(server, 4, "ScriptAlias \"%s\" for \"%s\"", prefix, path); mprFree(path); maInsertAlias(host, alias); if ((location = maLookupLocation(host, prefix)) == 0) { location = maCreateLocation(host, state->location); maSetLocationAuth(location, state->dir->auth); maSetLocationPrefix(location, prefix); maAddLocation(host, location); } else { maSetLocationPrefix(location, prefix); } maSetHandler(http, host, location, "cgiHandler"); return 1; } 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); } }