/* grid = ediMakeGrid("[ \ { id: '1', country: 'Australia' }, \ { id: '2', country: 'China' }, \ ]"); */ EdiGrid *ediMakeGrid(cchar *json) { MprHash *obj, *row; MprKey *kp; EdiGrid *grid; EdiRec *rec; int r, nrows, nfields; if ((obj = mprDeserialize(json)) == 0) { return 0; } nrows = mprGetHashLength(obj); if ((grid = ediCreateBareGrid(NULL, "", nrows)) == 0) { return 0; } for (r = 0, ITERATE_KEYS(obj, kp)) { if (kp->type != MPR_JSON_OBJ) { continue; } row = (MprHash*) kp->data; nfields = mprGetHashLength(row); if ((rec = ediCreateBareRec(NULL, "", nfields)) == 0) { return 0; } if (ediSetFields(rec, row) == 0) { return 0; } grid->records[r++] = rec; } return 0; }
/* rec = ediMakeRec("{ id: 1, title: 'Message One', body: 'Line one' }"); */ EdiRec *ediMakeRec(cchar *json) { MprHash *obj; MprKey *kp; EdiRec *rec; EdiField *fp; int f, nfields; if ((obj = mprDeserialize(json)) == 0) { return 0; } nfields = mprGetHashLength(obj); if ((rec = ediCreateBareRec(NULL, "", nfields)) == 0) { return 0; } for (f = 0, ITERATE_KEYS(obj, kp)) { if (kp->type == MPR_JSON_ARRAY || kp->type == MPR_JSON_OBJ) { continue; } fp = &rec->fields[f++]; fp->valid = 1; fp->name = kp->key; fp->value = kp->data; fp->type = EDI_TYPE_STRING; fp->flags = 0; } return rec; }
static int runCommand(HttpConn *conn, cchar *command, cchar *csource, cchar *module) { EspReq *req; EspRoute *eroute; MprCmd *cmd; MprKey *var; MprList *elist; cchar **env; char *err, *out; req = conn->data; eroute = req->route->eroute; cmd = mprCreateCmd(conn->dispatcher); if ((req->commandLine = espExpandCommand(eroute, command, csource, module)) == 0) { httpError(conn, HTTP_CODE_INTERNAL_SERVER_ERROR, "Missing EspCompile directive for %s", csource); return MPR_ERR_CANT_READ; } mprLog(4, "ESP command: %s\n", req->commandLine); if (eroute->env) { elist = mprCreateList(0, 0); for (ITERATE_KEYS(eroute->env, var)) { mprAddItem(elist, sfmt("%s=%s", var->key, var->data)); } mprAddNullItem(elist); env = (cchar**) &elist->items[0]; } else {
static void pruneFlash(HttpConn *conn) { EspReq *req; MprKey *kp, *lp; req = conn->reqData; if (req->flash && req->lastFlash) { for (ITERATE_KEYS(req->flash, kp)) { for (ITERATE_KEYS(req->lastFlash, lp)) { if (smatch(kp->key, lp->key)) { mprRemoveKey(req->flash, kp->key); } } } } }
static int runCommand(HttpRoute *route, MprDispatcher *dispatcher, cchar *command, cchar *csource, cchar *module, char **errMsg) { MprCmd *cmd; MprKey *var; MprList *elist; EspRoute *eroute; cchar **env, *commandLine; char *err, *out; int rc; *errMsg = 0; eroute = route->eroute; cmd = mprCreateCmd(dispatcher); if ((commandLine = espExpandCommand(route, command, csource, module)) == 0) { *errMsg = sfmt("Missing EspCompile directive for %s", csource); return MPR_ERR_CANT_READ; } mprTrace(4, "ESP command: %s\n", commandLine); if (eroute->env) { elist = mprCreateList(0, MPR_LIST_STABLE); for (ITERATE_KEYS(eroute->env, var)) { mprAddItem(elist, sfmt("%s=%s", var->key, var->data)); } mprAddNullItem(elist); env = (cchar**) &elist->items[0]; } else {
static void finalizeFlash(HttpConn *conn) { EspReq *req; MprKey *kp, *lp; req = conn->data; if (req->flash) { mprAssert(req->flash->fn); if (req->lastFlash) { mprAssert(req->lastFlash->fn); for (ITERATE_KEYS(req->flash, kp)) { for (ITERATE_KEYS(req->lastFlash, lp)) { if (smatch(kp->key, lp->key) && kp->data == lp->data) { mprRemoveKey(req->flash, kp->key); } } } }
/* Render a document by mapping a URL target to a document. The target is interpreted relative to route->documents. If target exists, then serve that. If target + extension exists, serve that. If target is a directory and an index.esp, return the index.esp without a redirect. If target is a directory without a trailing "/" but with an index.esp, do an external redirect to "URI/". If target does not end with ".esp", then do not serve that. */ PUBLIC void espRenderDocument(HttpConn *conn, cchar *target) { HttpUri *up; MprKey *kp; cchar *dest; assert(target); for (ITERATE_KEYS(conn->rx->route->extensions, kp)) { if (kp->key && *kp->key) { if ((dest = checkView(conn, target, 0, kp->key)) != 0) { espRenderView(conn, dest, 0); return; } } } if ((dest = checkView(conn, target, 0, "esp")) != 0) { espRenderView(conn, dest, 0); return; } if ((dest = checkView(conn, target, "index", "esp")) != 0) { /* Must do external redirect first if URL does not end with "/" */ if (!sends(conn->rx->parsedUri->path, "/")) { up = conn->rx->parsedUri; httpRedirect(conn, HTTP_CODE_MOVED_PERMANENTLY, httpFormatUri(up->scheme, up->host, up->port, sjoin(up->path, "/", NULL), up->reference, up->query, 0)); return; } espRenderView(conn, dest, 0); return; } /* Remove in version 6 */ #if DEPRECATED || 1 if ((dest = checkView(conn, sjoin("app/", target, NULL), 0, "esp")) != 0) { espRenderView(conn, dest, 0); return; } #endif /* Last chance, forward to the file handler ... not an ESP request. This enables static file requests within ESP routes. */ httpTrace(conn, "esp.handler", "context", "msg: 'Relay to the fileHandler"); conn->rx->target = &conn->rx->pathInfo[1]; httpMapFile(conn); if (conn->tx->fileInfo.isDir) { httpHandleDirectory(conn); } httpSetFileHandler(conn, 0); }
static int copyVars(HttpConn *conn, cchar **envv, int index, MprHash *vars, cchar *prefix) { MprKey *kp; for (ITERATE_KEYS(vars, kp)) { if (kp->data) { copyInner(conn, envv, index++, kp->key, kp->data, prefix); } } envv[index] = 0; return index; }
/* Compute a set of abilities for a role. Role strings can be either roles or abilities. The abilities hash is updated. */ PUBLIC void httpComputeRoleAbilities(HttpAuth *auth, MprHash *abilities, cchar *role) { MprKey *ap; HttpRole *rp; if ((rp = mprLookupKey(auth->roles, role)) != 0) { /* Interpret as a role */ for (ITERATE_KEYS(rp->abilities, ap)) { if (!mprLookupKey(abilities, ap->key)) { mprAddKey(abilities, ap->key, MPR->oneString); } } } else {
/* Create a per user session database clone. Used for demos so one users updates to not change anothers view of the database. */ static void pruneDatabases(Esp *esp) { MprKey *kp; lock(esp); for (ITERATE_KEYS(esp->databases, kp)) { if (!httpLookupSessionID(kp->key)) { mprRemoveKey(esp->databases, kp->key); /* Restart scan */ kp = 0; } } unlock(esp); }
EdiRec *ediSetFields(EdiRec *rec, MprHash *params) { MprKey *kp; if (rec == 0) { return 0; } for (ITERATE_KEYS(params, kp)) { if (kp->type == MPR_JSON_ARRAY || kp->type == MPR_JSON_OBJ) { continue; } if (!ediSetField(rec, kp->key, kp->data)) { return 0; } } return rec; }
/* Test if the user has the requisite abilities to perform an action. Abilities may be explicitly defined or if NULL, the abilities specified by the route are used. */ PUBLIC bool httpCanUser(HttpConn *conn, cchar *abilities) { HttpAuth *auth; char *ability, *tok; MprKey *kp; auth = conn->rx->route->auth; if (auth->permittedUsers && !mprLookupKey(auth->permittedUsers, conn->username)) { return 0; } if (!auth->abilities && !abilities) { /* No abilities are required */ return 1; } if (!conn->username) { /* User not authenticated */ return 0; } if (!conn->user && (conn->user = mprLookupKey(auth->userCache, conn->username)) == 0) { return 0; } if (abilities) { for (ability = stok(sclone(abilities), " \t,", &tok); abilities; abilities = stok(NULL, " \t,", &tok)) { if (!mprLookupKey(conn->user->abilities, ability)) { return 0; } } } else { for (ITERATE_KEYS(auth->abilities, kp)) { if (!mprLookupKey(conn->user->abilities, kp->key)) { return 0; } } } return 1; }
void espShowRequest(HttpConn *conn) { MprHash *env; MprKey *kp; MprBuf *buf; HttpRx *rx; HttpQueue *q; cchar *query; char qbuf[MPR_MAX_STRING], **keys, *value; int i, numKeys; rx = conn->rx; httpSetHeaderString(conn, "Cache-Control", "no-cache"); httpCreateCGIParams(conn); espRender(conn, "\r\n"); /* Query */ if ((query = espGetQueryString(conn)) != 0) { scopy(qbuf, sizeof(qbuf), query); if ((numKeys = getParams(&keys, qbuf, (int) strlen(qbuf))) > 0) { for (i = 0; i < (numKeys * 2); i += 2) { value = keys[i+1]; espRender(conn, "QUERY %s=%s\r\n", keys[i], value ? value: "null"); } } espRender(conn, "\r\n"); } /* Http Headers */ env = espGetHeaderHash(conn); for (ITERATE_KEYS(env, kp)) { espRender(conn, "HEADER %s=%s\r\n", kp->key, kp->data ? kp->data: "null"); } espRender(conn, "\r\n"); /* Server vars */ for (ITERATE_KEYS(conn->rx->svars, kp)) { espRender(conn, "SERVER %s=%s\r\n", kp->key, kp->data ? kp->data: "null"); } espRender(conn, "\r\n"); /* Form vars */ if ((env = espGetParams(conn)) != 0) { for (ITERATE_KEYS(env, kp)) { espRender(conn, "FORM %s=%s\r\n", kp->key, kp->data ? kp->data: "null"); } espRender(conn, "\r\n"); } /* Body */ q = conn->readq; if (q->first && rx->bytesRead > 0 && scmp(rx->mimeType, "application/x-www-form-urlencoded") == 0) { buf = q->first->content; mprAddNullToBuf(buf); if ((numKeys = getParams(&keys, mprGetBufStart(buf), (int) mprGetBufLength(buf))) > 0) { for (i = 0; i < (numKeys * 2); i += 2) { value = keys[i+1]; espRender(conn, "BODY %s=%s\r\n", keys[i], value ? value: "null"); } } espRender(conn, "\r\n"); } }
PUBLIC void espShowRequest(HttpConn *conn) { MprHash *env; MprJson *params, *param; MprKey *kp; MprJson *jkey; HttpRx *rx; int i; rx = conn->rx; httpAddHeaderString(conn, "Cache-Control", "no-cache"); httpCreateCGIParams(conn); espRender(conn, "\r\n"); /* Query */ for (ITERATE_JSON(rx->params, jkey, i)) { espRender(conn, "PARAMS %s=%s\r\n", jkey->name, jkey->value ? jkey->value : "null"); } espRender(conn, "\r\n"); /* Http Headers */ env = espGetHeaderHash(conn); for (ITERATE_KEYS(env, kp)) { espRender(conn, "HEADER %s=%s\r\n", kp->key, kp->data ? kp->data: "null"); } espRender(conn, "\r\n"); /* Server vars */ for (ITERATE_KEYS(conn->rx->svars, kp)) { espRender(conn, "SERVER %s=%s\r\n", kp->key, kp->data ? kp->data: "null"); } espRender(conn, "\r\n"); /* Form vars */ if ((params = espGetParams(conn)) != 0) { for (ITERATE_JSON(params, param, i)) { espRender(conn, "FORM %s=%s\r\n", param->name, param->value); } espRender(conn, "\r\n"); } #if KEEP /* Body */ q = conn->readq; if (q->first && rx->bytesRead > 0 && scmp(rx->mimeType, "application/x-www-form-urlencoded") == 0) { buf = q->first->content; mprAddNullToBuf(buf); if ((numKeys = getParams(&keys, mprGetBufStart(buf), (int) mprGetBufLength(buf))) > 0) { for (i = 0; i < (numKeys * 2); i += 2) { value = keys[i+1]; espRender(conn, "BODY %s=%s\r\n", keys[i], value ? value: "null"); } } espRender(conn, "\r\n"); } #endif }