/* function setLimits(limits: Object): Void */ static EjsObj *hs_setLimits(Ejs *ejs, EjsHttpServer *sp, int argc, EjsObj **argv) { EjsObj *vp, *app, *cache, *cacheLimits; HttpLimits *limits; if (sp->limits == 0) { sp->limits = ejsCreateEmptyPot(ejs); limits = (sp->endpoint) ? sp->endpoint->limits : ejs->http->serverLimits; assert(limits); ejsGetHttpLimits(ejs, sp->limits, limits, 1); } ejsBlendObject(ejs, sp->limits, argv[0], EJS_BLEND_OVERWRITE); if (sp->endpoint) { limits = (sp->endpoint) ? sp->endpoint->limits : ejs->http->serverLimits; ejsSetHttpLimits(ejs, limits, sp->limits, 1); } if ((vp = ejsGetPropertyByName(ejs, sp->limits, EN("sessionTimeout"))) != 0) { app = ejsGetPropertyByName(ejs, ejs->global, N("ejs", "App")); cache = ejsGetPropertyByName(ejs, app, N("ejs", "cache")); if (cache && cache != ESV(null)) { cacheLimits = ejsCreateEmptyPot(ejs); ejsSetPropertyByName(ejs, cacheLimits, EN("lifespan"), vp); ejsCacheSetLimits(ejs, cache, cacheLimits); } } return 0; }
EjsArray *ejsCaptureStack(Ejs *ejs, int uplevels) { EjsFrame *fp; EjsState *state; EjsArray *stack; wchar *source; EjsObj *frame; char *filename; int index, lineNumber; assert(ejs); stack = ejsCreateArray(ejs, 0); index = 0; for (state = ejs->state; state; state = state->prev) { for (fp = state->fp; fp; fp = fp->caller) { if (uplevels-- <= 0) { frame = ejsCreateEmptyPot(ejs); if (ejsGetDebugInfo(ejs, (EjsFunction*) fp, fp->pc, &filename, &lineNumber, &source) >= 0) { ejsSetPropertyByName(ejs, frame, EN("filename"), ejsCreatePathFromAsc(ejs, filename)); ejsSetPropertyByName(ejs, frame, EN("lineno"), ejsCreateNumber(ejs, lineNumber)); ejsSetPropertyByName(ejs, frame, EN("code"), ejsCreateString(ejs, source, wlen(source))); } else { ejsSetPropertyByName(ejs, frame, EN("filename"), EST(undefined)); } ejsSetPropertyByName(ejs, frame, EN("func"), fp->function.name); ejsSetProperty(ejs, stack, index++, frame); } } } return stack; }
/* Break a uri into components function components(): Object */ static EjsObj *uri_components(Ejs *ejs, EjsUri *up, int argc, EjsObj **argv) { EjsObj *obj; HttpUri *uri; uri = up->uri; obj = ejsCreateEmptyPot(ejs); if (uri->scheme) { ejsSetPropertyByName(ejs, obj, EN("scheme"), ejsCreateStringFromAsc(ejs, uri->scheme)); } if (uri->host) { ejsSetPropertyByName(ejs, obj, EN("host"), ejsCreateStringFromAsc(ejs, uri->host)); } if (uri->port > 0) { ejsSetPropertyByName(ejs, obj, EN("port"), ejsCreateNumber(ejs, uri->port)); } if (uri->path) { ejsSetPropertyByName(ejs, obj, EN("path"), ejsCreateStringFromAsc(ejs, uri->path)); } if (uri->reference) { ejsSetPropertyByName(ejs, obj, EN("reference"), ejsCreateStringFromAsc(ejs, uri->reference)); } if (uri->query) { ejsSetPropertyByName(ejs, obj, EN("query"), ejsCreateStringFromAsc(ejs, uri->query)); } return obj; }
/* function get limits(): Object */ static EjsObj *http_limits(Ejs *ejs, EjsHttp *hp, int argc, EjsObj **argv) { if (hp->limits == 0) { hp->limits = (EjsObj*) ejsCreateEmptyPot(ejs); ejsGetHttpLimits(ejs, hp->limits, hp->conn->limits, 0); } return hp->limits; }
static EjsObj *getFileOptions(Ejs *ejs, EjsFile *fp, int argc, EjsObj **argv) { EjsObj *options; options = (EjsObj*) ejsCreateEmptyPot(ejs); ejsSetPropertyByName(ejs, options, EN("mode"), ejsCreateStringFromAsc(ejs, fp->modeString)); ejsSetPropertyByName(ejs, options, EN("permissions"), ejsCreateNumber(ejs, fp->perms)); return options; }
/* function get limits(): Object */ static EjsObj *hs_limits(Ejs *ejs, EjsHttpServer *sp, int argc, EjsObj **argv) { HttpLimits *limits; if (sp->limits == 0) { sp->limits = ejsCreateEmptyPot(ejs); limits = (sp->endpoint) ? sp->endpoint->limits : ejs->http->serverLimits; assert(limits); ejsGetHttpLimits(ejs, sp->limits, limits, 1); } return sp->limits; }
/* function set limits(limits: Object): Void */ static EjsObj *http_setLimits(Ejs *ejs, EjsHttp *hp, int argc, EjsObj **argv) { if (hp->conn->limits == ejs->http->clientLimits) { httpSetUniqueConnLimits(hp->conn); } if (hp->limits == 0) { hp->limits = (EjsObj*) ejsCreateEmptyPot(ejs); ejsGetHttpLimits(ejs, hp->limits, hp->conn->limits, 0); } ejsBlendObject(ejs, hp->limits, argv[0], EJS_BLEND_OVERWRITE); ejsSetHttpLimits(ejs, hp->conn->limits, hp->limits, 0); return 0; }
/* Return the (proposed) request headers function getRequestHeaders(): Object */ static EjsPot *http_getRequestHeaders(Ejs *ejs, EjsHttp *hp, int argc, EjsObj **argv) { MprKey *kp; HttpConn *conn; EjsPot *headers; conn = hp->conn; headers = ejsCreateEmptyPot(ejs); for (kp = 0; conn->tx && (kp = mprGetNextKey(conn->tx->headers, kp)) != 0; ) { ejsSetPropertyByName(ejs, headers, EN(kp->key), ejsCreateStringFromAsc(ejs, kp->data)); } return headers; }
/* function get info(): Object */ static EjsObj *http_info(Ejs *ejs, EjsHttp *hp, int argc, EjsObj **argv) { EjsObj *obj; char *key, *next, *value; if (hp->conn && hp->conn->sock) { obj = ejsCreateEmptyPot(ejs); for (key = stok(mprGetSocketState(hp->conn->sock), ",", &next); key; key = stok(NULL, ",", &next)) { stok(key, "=", &value); ejsSetPropertyByName(ejs, obj, EN(key), ejsCreateStringFromAsc(ejs, value)); } return obj; } return ESV(null); }
/* function get headers(): Object */ static EjsPot *http_headers(Ejs *ejs, EjsHttp *hp, int argc, EjsObj **argv) { MprHash *hash; MprKey *kp; EjsPot *results; int i; if (!waitForResponseHeaders(hp)) { return 0; } results = ejsCreateEmptyPot(ejs); hash = httpGetHeaderHash(hp->conn); if (hash == 0) { return results; } for (i = 0, kp = mprGetFirstKey(hash); kp; kp = mprGetNextKey(hash, kp), i++) { ejsSetPropertyByName(ejs, results, EN(kp->key), ejsCreateStringFromAsc(ejs, kp->data)); } return results; }
/* Parse an object literal string pointed to by js->next into the given buffer. Update js->next to point to the next input token in the object literal. Supports nested object literals. */ static EjsObj *parseLiteralInner(Ejs *ejs, MprBuf *buf, JsonState *js) { EjsAny *obj, *vp; MprBuf *valueBuf; wchar *token, *key, *value; int tid, isArray; isArray = 0; tid = getNextJsonToken(buf, &token, js); if (tid == TOK_ERR || tid == TOK_EOF) { return 0; } if (tid == TOK_LBRACKET) { isArray = 1; obj = (EjsObj*) ejsCreateArray(ejs, 0); } else if (tid == TOK_LBRACE) { obj = ejsCreateEmptyPot(ejs); } else { return ejsParse(ejs, token, S_String); } if (obj == 0) { ejsThrowMemoryError(ejs); return 0; } while (1) { vp = 0; tid = peekNextJsonToken(js); if (tid == TOK_ERR) { return 0; } else if (tid == TOK_EOF) { break; } else if (tid == TOK_RBRACE || tid == TOK_RBRACKET) { getNextJsonToken(buf, &key, js); break; } if (tid == TOK_LBRACKET) { /* For array values */ vp = parseLiteral(ejs, js); assert(vp); } else if (tid == TOK_LBRACE) { /* For object values */ vp = parseLiteral(ejs, js); assert(vp); } else if (isArray) { tid = getNextJsonToken(buf, &value, js); vp = ejsParse(ejs, value, (tid == TOK_QID) ? S_String: -1); assert(vp); } else { getNextJsonToken(buf, &key, js); tid = peekNextJsonToken(js); if (tid == TOK_ERR) { return 0; } else if (tid == TOK_EOF) { break; } else if (tid == TOK_LBRACE || tid == TOK_LBRACKET) { vp = parseLiteral(ejs, js); } else if (tid == TOK_ID || tid == TOK_QID) { valueBuf = mprCreateBuf(0, 0); getNextJsonToken(valueBuf, &value, js); if (tid == TOK_QID) { vp = ejsCreateString(ejs, value, strlen(value)); } else { if (mcmp(value, "null") == 0) { vp = ESV(null); } else if (mcmp(value, "undefined") == 0) { vp = ESV(undefined); } else { vp = ejsParse(ejs, value, -1); } } assert(vp); } else { getNextJsonToken(buf, &value, js); js->error = js->next; return 0; } } if (vp == 0) { js->error = js->next; return 0; } if (isArray) { if (ejsSetProperty(ejs, obj, -1, vp) < 0) { ejsThrowMemoryError(ejs); return 0; } } else { if (ejsSetPropertyByName(ejs, obj, WEN(key), vp) < 0) { ejsThrowMemoryError(ejs); return 0; } } } return obj; }