/* 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; }
static EjsAny *createException(Ejs *ejs, EjsType *type, cchar* fmt, va_list fmtArgs) { EjsError *error; EjsAny *argv[1]; char *msg; assert(type); #if ME_DEBUG /* Breakpoint opportunity */ if (!ejs->empty) { mprNop(0); } #endif msg = sfmtv(fmt, fmtArgs); argv[0] = ejsCreateStringFromAsc(ejs, msg); if (argv[0] == 0) { assert(argv[0]); return 0; } if (EST(Error)->constructor.body.proc) { error = (EjsError*) ejsCreateInstance(ejs, type, 1, argv); } else { error = ejsCreatePot(ejs, type, 0); ejsSetProperty(ejs, error, ES_Error_message, ejsCreateStringFromAsc(ejs, msg)); } return error; }
/* function get statusMessage(): String */ static EjsString *http_statusMessage(Ejs *ejs, EjsHttp *hp, int argc, EjsObj **argv) { HttpConn *conn; if (!waitForResponseHeaders(hp)) { return 0; } conn = hp->conn; if (conn->errorMsg) { return ejsCreateStringFromAsc(ejs, conn->errorMsg); } return ejsCreateStringFromAsc(ejs, httpGetStatusMessage(hp->conn)); }
static EjsAny *coerceUriOperands(Ejs *ejs, EjsUri *lhs, int opcode, EjsAny *rhs) { HttpUri *uri; char *ustr; switch (opcode) { /* Binary operators */ case EJS_OP_ADD: uri = lhs->uri; ustr = httpFormatUri(uri->scheme, uri->host, uri->port, uri->path, uri->reference, uri->query, 0); return ejsInvokeOperator(ejs, ejsCreateStringFromAsc(ejs, ustr), opcode, rhs); case EJS_OP_COMPARE_EQ: case EJS_OP_COMPARE_NE: case EJS_OP_COMPARE_LE: case EJS_OP_COMPARE_LT: case EJS_OP_COMPARE_GE: case EJS_OP_COMPARE_GT: if (!ejsIsDefined(ejs, rhs)) { return ((opcode == EJS_OP_COMPARE_EQ) ? ESV(false): ESV(true)); } uri = lhs->uri; ustr = httpFormatUri(uri->scheme, uri->host, uri->port, uri->path, uri->reference, uri->query, 0); return ejsInvokeOperator(ejs, ejsCreateStringFromAsc(ejs, ustr), opcode, rhs); case EJS_OP_COMPARE_STRICTLY_NE: return ESV(true); case EJS_OP_COMPARE_STRICTLY_EQ: return ESV(false); case EJS_OP_COMPARE_NOT_ZERO: case EJS_OP_COMPARE_TRUE: return ESV(true); case EJS_OP_COMPARE_ZERO: case EJS_OP_COMPARE_FALSE: return ESV(false); case EJS_OP_COMPARE_UNDEFINED: case EJS_OP_COMPARE_NULL: return ESV(false); default: ejsThrowTypeError(ejs, "Opcode %d not valid for type %@", opcode, TYPE(lhs)->qname.name); return ESV(undefined); } return 0; }
/* Convert the array to a single string each member of the array has toString called on it and the resulting strings are concatenated. override function toString(): String */ static EjsString *arrayToString(Ejs *ejs, EjsArray *ap, int argc, EjsObj **argv) { EjsString *result, *comma; EjsObj *vp; int i, rc; result = ESV(empty); if (result == 0) { ejsThrowMemoryError(ejs); return 0; } comma = ejsCreateStringFromAsc(ejs, ","); for (i = 0; i < ap->length; i++) { vp = ap->data[i]; rc = 0; if (i > 0) { result = ejsJoinString(ejs, result, comma); } if (ejsIsDefined(ejs, vp)) { result = ejsJoinString(ejs, result, ejsToString(ejs, vp)); } if (rc < 0) { ejsThrowMemoryError(ejs); return 0; } } return result; }
/* HTML escape a string function escapeHtml(str: String): String */ static EjsObj *web_escapeHtml(Ejs *ejs, EjsObj *unused, int argc, EjsObj **argv) { EjsString *str; str = (EjsString*) argv[0]; return (EjsObj*) ejsCreateStringFromAsc(ejs, mprEscapeHtml(str->value)); }
/* function toLocalString(): String */ static EjsString *uri_toLocalString(Ejs *ejs, EjsUri *up, int argc, EjsObj **argv) { HttpUri *uri; uri = up->uri; return ejsCreateStringFromAsc(ejs, httpFormatUri(NULL, NULL, 0, uri->path, uri->reference, uri->query, 0)); }
/* function toString(): String */ static EjsString *uri_toString(Ejs *ejs, EjsUri *up, int argc, EjsObj **argv) { HttpUri *uri; uri = up->uri; return ejsCreateStringFromAsc(ejs, httpUriToString(uri, 0)); }
/* Get the query portion static function get query(): String? */ static EjsString *uri_query(Ejs *ejs, EjsUri *up, int argc, EjsObj **argv) { if (up->uri->query == 0) { return ESV(null); } return ejsCreateStringFromAsc(ejs, up->uri->query); }
/* function get key(): String */ static EjsAny *http_key(Ejs *ejs, EjsHttp *hp, int argc, EjsObj **argv) { if (hp->keyFile) { return ejsCreateStringFromAsc(ejs, hp->keyFile); } return ESV(null); }
/* Get the mimeType function mimeType(): String? */ static EjsString *uri_mimeType(Ejs *ejs, EjsUri *up, int argc, EjsObj **argv) { if (up->uri->ext == 0) { return ESV(null); } return ejsCreateStringFromAsc(ejs, mprLookupMime(NULL, up->uri->ext)); }
/* Get the Uri extension static function get extension(): String? */ static EjsString *uri_extension(Ejs *ejs, EjsUri *up, int argc, EjsObj **argv) { if (up->uri->ext == 0) { return ESV(null); } return ejsCreateStringFromAsc(ejs, up->uri->ext); }
/* Encode a Uri component (ECMA Standard) static function encodeComponent(str: String): String */ static EjsObj *encodeURIComponent(Ejs *ejs, EjsObj *unused, int argc, EjsObj **argv) { char *encoded; encoded = mprUriEncode(ejsToMulti(ejs, argv[0]), MPR_ENCODE_JS_URI_COMPONENT); return (EjsObj*) ejsCreateStringFromAsc(ejs, encoded); }
PUBLIC void ejsCreateArrayType(Ejs *ejs) { EjsType *type; EjsHelpers *helpers; type = ejsCreateCoreType(ejs, N("ejs", "Array"), sizeof(EjsArray), S_Array, ES_Array_NUM_CLASS_PROP, manageArray, EJS_TYPE_POT | EJS_TYPE_NUMERIC_INDICIES | EJS_TYPE_VIRTUAL_SLOTS | EJS_TYPE_MUTABLE_INSTANCES | EJS_TYPE_DYNAMIC_INSTANCES); helpers = &type->helpers; helpers->cast = (EjsCastHelper) castArray; helpers->clone = (EjsCloneHelper) ejsCloneArray; helpers->create = (EjsCreateHelper) createArray; helpers->getProperty = (EjsGetPropertyHelper) getArrayProperty; helpers->getPropertyCount = (EjsGetPropertyCountHelper) getArrayPropertyCount; helpers->getPropertyByName = (EjsGetPropertyByNameHelper) getArrayPropertyByName; helpers->deleteProperty = (EjsDeletePropertyHelper) deleteArrayProperty; helpers->deletePropertyByName = (EjsDeletePropertyByNameHelper) deleteArrayPropertyByName; helpers->invokeOperator = (EjsInvokeOperatorHelper) invokeArrayOperator; helpers->lookupProperty = (EjsLookupPropertyHelper) lookupArrayProperty; helpers->setProperty = (EjsSetPropertyHelper) setArrayProperty; helpers->setPropertyByName = (EjsSetPropertyByNameHelper) setArrayPropertyByName; ejsAddImmutable(ejs, S_length, EN("length"), ejsCreateStringFromAsc(ejs, "length")); }
/* function get name(): String */ static EjsString *hs_name(Ejs *ejs, EjsHttpServer *sp, int argc, EjsObj **argv) { if (sp->name) { return ejsCreateStringFromAsc(ejs, sp->name); } return ESV(null); }
/* Get the scheme portion static function get scheme(): String? */ static EjsString *uri_scheme(Ejs *ejs, EjsUri *up, int argc, EjsObj **argv) { if (up->uri->scheme == 0) { return ESV(null); } return ejsCreateStringFromAsc(ejs, up->uri->scheme); }
/* function get certificate(): String */ static EjsString *http_certificate(Ejs *ejs, EjsHttp *hp, int argc, EjsObj **argv) { if (hp->certFile) { return ejsCreateStringFromAsc(ejs, hp->certFile); } return ESV(null); }
static EjsString *mapSpace(Ejs *ejs, EjsString *space) { if (ejsContainsAsc(ejs, space, "internal-") != 0) { return ejsCreateStringFromAsc(ejs, "internal"); } return space; }
static int process(EjsMod *mp, cchar *output, int argc, char **argv) { Ejs *ejs; EjsModule *module; MprFile *outfile; MprList *depends; int count, i, next, moduleCount; ejs = mp->ejs; if (output) { outfile = mprOpenFile(output, O_CREAT | O_WRONLY | O_TRUNC | O_BINARY, 0664); } else { outfile = 0; } ejs->loaderCallback = (mp->listing) ? emListingLoadCallback : 0; mp->firstGlobal = ejsGetLength(ejs, ejs->global); /* For each module on the command line */ for (i = 0; i < argc && !mp->fatalError; i++) { moduleCount = mprGetListLength(ejs->modules); ejs->loadData = mp; if (!mprPathExists(argv[i], R_OK)) { mprError("Can't access module %s", argv[i]); return EJS_ERR; } if ((ejsLoadModule(ejs, ejsCreateStringFromAsc(ejs, argv[i]), -1, -1, EJS_LOADER_NO_INIT)) < 0) { ejs->loaderCallback = NULL; mprError("Can't load module %s\n%s", argv[i], ejsGetErrorMsg(ejs, 0)); return EJS_ERR; } if (mp->genSlots) { for (next = moduleCount; (module = mprGetNextItem(ejs->modules, &next)) != 0; ) { emCreateSlotFiles(mp, module, outfile); } } if (mp->depends) { depends = mprCreateList(-1, 0); for (next = moduleCount; (module = mprGetNextItem(ejs->modules, &next)) != 0; ) { getDepends(ejs, depends, module); } count = mprGetListLength(depends); for (next = 1; (module = mprGetNextItem(depends, &next)) != 0; ) { int version = module->version; mprPrintf("%@-%d.%d.%d%s", module->name, EJS_MAJOR(version), EJS_MINOR(version), EJS_PATCH(version), (next >= count) ? "" : " "); } printf("\n"); } } if (mp->html || mp->xml) { emCreateDoc(mp); } mprCloseFile(outfile); return 0; }
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; }
/* Get an environment var function getenv(key: String): String */ static EjsAny *app_getenv(Ejs *ejs, EjsObj *app, int argc, EjsObj **argv) { cchar *value; value = getenv(ejsToMulti(ejs, argv[0])); if (value == 0) { return ESV(null); } return ejsCreateStringFromAsc(ejs, value); }
/* Get a property name @param ejs VM handle. @param sp is set to the object instance. @param slotNum Slot number of the property to retrieve. The VM maps the property names to slots. @return The qualified property name. */ static EjsName getPropertyName(Ejs *ejs, Shape *sp, int slotNum) { /* To be thread-safe, we must have a different qname structure for each property name. */ switch (slotNum) { case ES_nclass_Shape_x: { static EjsName qname; qname.name = ejsCreateStringFromAsc(ejs, "y"); qname.space = 0; return qname; } case ES_nclass_Shape_y: { static EjsName qname; qname.space = 0; return qname; } case ES_nclass_Shape_height: { static EjsName qname; qname.name = ejsCreateStringFromAsc(ejs, "height"); qname.space = 0; return qname; } case ES_nclass_Shape_width: { static EjsName qname; qname.name = ejsCreateStringFromAsc(ejs, "width"); qname.space = 0; return qname; } default: { static EjsName qname; qname.name = 0; qname.space = 0; ejsThrowReferenceError(ejs, "Bad slot reference"); return qname; } } }
/* Get the application command line arguments static function get args(): Array */ static EjsArray *app_args(Ejs *ejs, EjsObj *unused, int argc, EjsObj **argv) { EjsArray *args; int i; args = ejsCreateArray(ejs, ejs->argc); for (i = 0; i < ejs->argc; i++) { ejsSetProperty(ejs, args, i, ejsCreateStringFromAsc(ejs, ejs->argv[i])); } return args; }
/* function get provider(): String */ static EjsString *http_provider(Ejs *ejs, EjsHttp *hp, int argc, EjsObj **argv) { cchar *name; if (hp->ssl && hp->ssl->provider) { name = hp->ssl->provider->name; } else { name = MPR->socketService->sslProvider; } return ejsCreateStringFromAsc(ejs, name); }
/* function get ipaddr(): String */ static EjsString *system_ipaddr(Ejs *ejs, EjsObj *unused, int argc, EjsObj **argv) { // MOB - move this into MPR and call mprSetIpAddr #if BIT_UNIX_LIKE || BIT_WIN_LIKE struct addrinfo *res, *reslist, hints; cchar *ip; char ipaddr[BIT_MAX_PATH], service[BIT_MAX_PATH]; int rc; if ((ip = mprGetIpAddr(ejs)) != 0) { return ejsCreateStringFromAsc(ejs, mprGetIpAddr(ejs)); } memset((char*) &hints, 0, sizeof(hints)); hints.ai_socktype = SOCK_STREAM; hints.ai_family = AF_INET; hints.ai_flags = AI_PASSIVE; if ((rc = getaddrinfo(mprGetHostName(), NULL, &hints, &reslist)) == 0) { ip = 0; // TODO - support IPv6 for (res = reslist; res; res = res->ai_next) { if (getnameinfo(res->ai_addr, (socklen_t) res->ai_addrlen, ipaddr, (int) sizeof(ipaddr) - 1, service, (int) sizeof(service) - 1, NI_NUMERICHOST | NI_NUMERICSERV | NI_NOFQDN) == 0) { if (strncmp(ipaddr, "10.", 3) == 0 || strncmp(ipaddr, "127.", 4) == 0 || strncmp(ipaddr, "169.", 4) == 0 || strncmp(ipaddr, "172.", 4) == 0 || strncmp(ipaddr, "192.", 4) == 0) { if (ip == 0) { ip = sclone(ipaddr); } } else { ip = sclone(ipaddr); break; } } } return ejsCreateStringFromAsc(ejs, ip ? ip : "127.0.0.1"); } else { mprError("Cannot get IP address, check system hostname. Error %d.\n", rc); } #endif return ESV(null); }
PUBLIC EjsUri *ejsCreateUriFromAsc(Ejs *ejs, cchar *path) { EjsUri *up; EjsObj *arg; if ((up = ejsCreateObj(ejs, ESV(Uri), 0)) == 0) { return 0; } arg = (EjsObj*) ejsCreateStringFromAsc(ejs, path); uri_constructor(ejs, up, 1, (EjsObj**) &arg); return up; }
/* Cast the object operand to a primitive type */ static EjsObj *xlCast(Ejs *ejs, EjsXML *vp, EjsType *type) { MprBuf *buf; EjsObj *result; EjsXML *elt, *item; int next; if (type == ESV(XML)) { return (EjsObj*) vp; } switch (type->sid) { case S_Object: case S_Boolean: return (EjsObj*) ejsCreateBoolean(ejs, 1); case S_Number: result = xlCast(ejs, vp, ESV(String)); result = (EjsObj*) ejsToNumber(ejs, result); return result; case S_String: buf = mprCreateBuf(MPR_BUFSIZE, -1); if (mprGetListLength(vp->elements) == 1) { elt = mprGetFirstItem(vp->elements); if (elt->kind == EJS_XML_ELEMENT) { if (elt->elements == 0) { return (EjsObj*) ESV(empty); } if (elt->elements && mprGetListLength(elt->elements) == 1) { // TODO - what about PI and comments? item = mprGetFirstItem(elt->elements); if (item->kind == EJS_XML_TEXT) { return (EjsObj*) item->value; } } } } for (next = 0; (elt = mprGetNextItem(vp->elements, &next)) != 0; ) { if (ejsXMLToBuf(ejs, buf, elt, -1) < 0) { return 0; } if (next < vp->elements->length) { mprPutStringToBuf(buf, " "); } } return (EjsObj*) ejsCreateStringFromAsc(ejs, (char*) buf->start); default: ejsThrowTypeError(ejs, "Cannot cast to this type"); return 0; } }
/* function get providers(): Array */ static EjsArray *http_providers(Ejs *ejs, EjsHttp *hp, int argc, EjsObj **argv) { EjsArray *result; int i; result = ejsCreateArray(ejs, 0); i = 0; #if BIT_PACK_EST ejsSetProperty(ejs, result, i++, ejsCreateStringFromAsc(ejs, "est")); #endif #if BIT_PACK_OPENSSL ejsSetProperty(ejs, result, i++, ejsCreateStringFromAsc(ejs, "openssl")); #endif #if BIT_PACK_MATRIXSSL ejsSetProperty(ejs, result, i++, ejsCreateStringFromAsc(ejs, "matrixssl")); #endif #if BIT_PACK_MOCANA ejsSetProperty(ejs, result, i++, ejsCreateStringFromAsc(ejs, "mocana")); #endif return result; }
static EjsString *getStringHeader(Ejs *ejs, EjsHttp *hp, cchar *key) { cchar *value; if (!waitForResponseHeaders(hp)) { return 0; } value = httpGetHeader(hp->conn, key); if (value == 0) { return ESV(null); } return ejsCreateStringFromAsc(ejs, value); }
/* 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; }