/* * Write the port so the monitor can manage */ static int writePort(MaHost *host) { char *cp, numBuf[16], *path; int fd, port, len; path = mprJoinPath(host, mprGetAppDir(host), "../.port.log"); if ((fd = open(path, O_CREAT | O_WRONLY | O_TRUNC, 0666)) < 0) { mprError(host, "Could not create port file %s\n", path); return MPR_ERR_CANT_CREATE; } cp = host->ipAddrPort; if ((cp = strchr(host->ipAddrPort, ':')) != 0) { port = atoi(++cp); } else { port = 80; } mprItoa(numBuf, sizeof(numBuf), port, 10); len = (int) strlen(numBuf); numBuf[len++] = '\n'; if (write(fd, numBuf, len) != len) { mprError(host, "Write to file %s failed\n", path); return MPR_ERR_CANT_WRITE; } close(fd); return 0; }
static void ejs_list_helper(struct clilist_file_info *info, const char *mask, void *state) { MprVar *result = (MprVar *)state; char idx[16]; mprItoa(result->properties->numDataItems, idx, sizeof(idx)); mprSetVar(result, idx, mprString(info->name)); }
int MprBuf::putInt(int i) { char numBuf[16]; int rc; mprItoa(i, numBuf, sizeof(numBuf)); rc = put(numBuf); *((char*) end) = (char) '\0'; return rc; }
/* * Add a number to the buffer (always null terminated). */ int mprPutIntToBuf(MprBuf *bp, int64 i) { char numBuf[16]; int rc; mprItoa(numBuf, sizeof(numBuf), i, 10); rc = mprPutStringToBuf(bp, numBuf); if (bp->end < bp->endbuf) { *((char*) bp->end) = (char) '\0'; } return rc; }
EjsVar *ejsAddArrayElt(Ejs *ep, EjsVar *op, EjsVar *element, EjsCopyDepth copyDepth) { EjsProperty *pp; EjsVar *vp; char idx[16]; int length; mprAssert(op->isArray); length = ejsGetPropertyAsInteger(ep, op, "length"); mprItoa(idx, sizeof(idx), length); pp = ejsCreateProperty(ep, op, idx); vp = ejsGetVarPtr(pp); ejsWriteVar(ep, vp, element, copyDepth); ejsSetPropertyToInteger(ep, op, "length", length + 1); return vp; }
int ejsArrayConstructor(Ejs *ep, EjsVar *thisObj, int argc, EjsVar **argv) { EjsProperty *pp; EjsVar *vp; char idx[16]; int i, max; thisObj->isArray = 1; max = 0; if (argc > 0) { if (argc == 1 && ejsVarIsNumber(argv[0])) { /* * x = new Array(size); */ max = (int) ejsVarToInteger(argv[0]); } else { /* * x = new Array(element0, element1, ..., elementN): */ max = argc; for (i = 0; i < max; i++) { mprItoa(idx, sizeof(idx), i); pp = ejsCreateSimpleProperty(ep, thisObj, idx); vp = ejsGetVarPtr(pp); ejsWriteVar(ep, vp, argv[i], EJS_SHALLOW_COPY); } } } pp = ejsCreateSimpleProperty(ep, thisObj, "length"); ejsMakePropertyEnumerable(pp, 0); vp = ejsGetVarPtr(pp); ejsWriteVarAsInteger(ep, vp, max); vp->isArrayLength = 1; return 0; }
/* add an indexed array element to a property */ void mprAddArray(struct MprVar *var, int i, struct MprVar v) { char idx[16]; mprItoa(i, idx, sizeof(idx)); mprSetVar(var, idx, v); }
/* * Format a fully qualified URI */ char *mprFormatUri(MprCtx ctx, cchar *scheme, cchar *host, int port, cchar *path, cchar *query) { char portBuf[16], *uri; cchar *portDelim, *pathDelim, *queryDelim; int defaultPort, len; len = 0; if (scheme == 0 || *scheme == '\0') { scheme = "http"; } len += (int) strlen(scheme) + 3; /* Add 3 for "://" */ defaultPort = (strcmp(scheme, "http") == 0) ? 80 : 443; if (host == 0 || *host == '\0') { host = "localhost"; } /* * Hosts with integral port specifiers override */ if (strchr(host, ':')) { portDelim = 0; } else { if (port != defaultPort) { mprItoa(portBuf, sizeof(portBuf), port, 10); portDelim = ":"; } else { portBuf[0] = '\0'; portDelim = ""; } len += (int) strlen(portBuf) + (int) strlen(portDelim); } len += (int) strlen(host); if (path) { pathDelim = (*path == '/') ? "" : "/"; } else { pathDelim = "/"; path = ""; } len += (int) strlen(path) + (int) strlen(pathDelim); if (query && *query) { queryDelim = "?"; } else { queryDelim = query = ""; } len += (int) strlen(query) + (int) strlen(queryDelim); len += 1; /* Add one for the null */ uri = mprAlloc(ctx, len); if (uri == 0) { return 0; } if (portDelim) { uri = mprAsprintf(ctx, len, "%s://%s%s%s%s%s%s%s", scheme, host, portDelim, portBuf, pathDelim, path, queryDelim, query); } else { uri = mprAsprintf(ctx, len, "%s://%s%s%s%s%s", scheme, host, pathDelim, path, queryDelim, query); } if (uri == 0) { return 0; } return uri; }
/* Build the command arguments. NOTE: argv is untrusted input. */ static void buildArgs(MaConn *conn, MprCmd *cmd, int *argcp, char ***argvp) { MaRequest *req; MaResponse *resp; char *fileName, **argv, status[8], *indexQuery, *cp, *tok; cchar *actionProgram; int argc, argind, len; req = conn->request; resp = conn->response; fileName = resp->filename; mprAssert(fileName); actionProgram = 0; argind = 0; argc = *argcp; if (resp->extension) { actionProgram = maGetMimeActionProgram(req->host, resp->extension); if (actionProgram != 0) { argc++; } } /* This is an Apache compatible hack for PHP 5.3 */ mprItoa(status, sizeof(status), MPR_HTTP_CODE_MOVED_TEMPORARILY, 10); mprAddHash(req->headers, "REDIRECT_STATUS", mprStrdup(req, status)); /* Count the args for ISINDEX queries. Only valid if there is not a "=" in the query. If this is so, then we must not have these args in the query env also? */ indexQuery = req->parsedUri->query; if (indexQuery && !strchr(indexQuery, '=')) { argc++; for (cp = indexQuery; *cp; cp++) { if (*cp == '+') { argc++; } } } else { indexQuery = 0; } #if BLD_WIN_LIKE || VXWORKS { char *bangScript, *cmdBuf, *program, *cmdScript; /* On windows we attempt to find an executable matching the fileName. We look for *.exe, *.bat and also do unix style processing "#!/program" */ findExecutable(conn, &program, &cmdScript, &bangScript, fileName); mprAssert(program); if (cmdScript) { /* Cmd/Batch script (.bat | .cmd) Convert the command to the form where there are 4 elements in argv that cmd.exe can interpret. argv[0] = cmd.exe argv[1] = /Q argv[2] = /C argv[3] = ""script" args ..." */ argc = 4; len = (argc + 1) * sizeof(char*); argv = (char**) mprAlloc(cmd, len); memset(argv, 0, len); argv[argind++] = program; /* Duped in findExecutable */ argv[argind++] = mprStrdup(cmd, "/Q"); argv[argind++] = mprStrdup(cmd, "/C"); len = (int) strlen(cmdScript) + 2 + 1; cmdBuf = (char*) mprAlloc(cmd, len); mprSprintf(cmdBuf, len, "\"%s\"", cmdScript); argv[argind++] = cmdBuf; mprSetCmdDir(cmd, cmdScript); mprFree(cmdScript); /* program will get freed when argv[] gets freed */ } else if (bangScript) { /* Script used "#!/program". NOTE: this may be overridden by a mime Action directive. */ argc++; /* Adding bangScript arg */ len = (argc + 1) * sizeof(char*); argv = (char**) mprAlloc(cmd, len); memset(argv, 0, len); argv[argind++] = program; /* Will get freed when argv[] is freed */ argv[argind++] = bangScript; /* Will get freed when argv[] is freed */ mprSetCmdDir(cmd, bangScript); } else { /* Either unknown extension or .exe (.out) program. */ len = (argc + 1) * sizeof(char*); argv = (char**) mprAlloc(cmd, len); memset(argv, 0, len); if (actionProgram) { argv[argind++] = mprStrdup(cmd, actionProgram); } argv[argind++] = program; } } #else len = (argc + 1) * (int) sizeof(char*); argv = (char**) mprAlloc(cmd, len); memset(argv, 0, len); if (actionProgram) { argv[argind++] = mprStrdup(cmd, actionProgram); } argv[argind++] = mprStrdup(cmd, fileName); #endif /* ISINDEX queries. Only valid if there is not a "=" in the query. If this is so, then we must not have these args in the query env also? */ if (indexQuery) { indexQuery = mprStrdup(cmd, indexQuery); cp = mprStrTok(indexQuery, "+", &tok); while (cp) { argv[argind++] = mprEscapeCmd(resp, mprUrlDecode(resp, cp), 0); cp = mprStrTok(NULL, "+", &tok); } } mprAssert(argind <= argc); argv[argind] = 0; *argcp = argc; *argvp = argv; }
static int doRequest(MprHttp *http, cchar *url, MprList *fields, MprList *files) { MprHttpResponse *resp; MprKeyValue *header; char buf[MPR_HTTP_BUFSIZE], seqBuf[16], *responseHeaders, *redirect; int64 contentLen; int code, next, count, bytes, transCount; mprAssert(url && *url); mprLog(http, MPR_DEBUG, "fetch: %s %s", method, url); /* * Send the request */ count = -1; transCount = 0; do { for (next = 0; (header = mprGetNextItem(headers, &next)) != 0; ) { mprSetHttpHeader(http, 0, header->key, header->value); } if (sequence) { static int next = 0; mprItoa(seqBuf, sizeof(seqBuf), next++, 10); mprSetHttpHeader(http, 1, "X-Http-Seq", seqBuf); } if (ranges) { mprSetHttpHeader(http, 1, "Range", ranges); } if (fields) { mprSetHttpHeader(http, 1, "Content-Type", "application/x-www-form-urlencoded"); } if (chunkSize) { mprSetHttpChunked(http, 1); } if (setContentLength(http, fields, files) < 0) { return MPR_ERR_CANT_OPEN; } if (mprStartHttpRequest(http, method, url) < 0) { mprError(http, "Can't process request for \"%s\". %s", url, mprGetHttpError(http)); return MPR_ERR_CANT_OPEN; } /* * This program does not do full-duplex writes with reads. ie. if you have a request that sends and receives * data in parallel -- http will do the writes first then read the response. */ if (files || fields) { if (writeBody(http, fields, files) < 0) { mprError(http, "Can't write body data to \"%s\". %s", url, mprGetHttpError(http)); return MPR_ERR_CANT_WRITE; } } else { if (chunkSize) { mprFinalizeHttpWriting(http); } mprWaitForHttpResponse(http, -1); } #if WIN _setmode(fileno(stdout), O_BINARY); #endif while ((bytes = mprReadHttp(http, buf, sizeof(buf))) > 0) { showOutput(http, buf, bytes); } mprWaitForHttp(http, MPR_HTTP_STATE_COMPLETE, -1); /* May not be complete if a disconnect occurs */ if (http->state >= MPR_HTTP_STATE_CONTENT) { if (mprNeedHttpRetry(http, &redirect)) { if (redirect) { url = resolveUrl(http, redirect); } count--; transCount++; continue; } break; } } while (++count < http->retries && transCount < 4 && !mprIsExiting(http)); if (count >= http->retries) { mprError(http, "http: failed \"%s\" request for %s after %d attempt(s)", method, url, count); return MPR_ERR_TOO_MANY; } if (mprIsExiting(http)) { return MPR_ERR_BAD_STATE; } /* * Request now complete */ code = mprGetHttpCode(http); contentLen = mprGetHttpContentLength(http); mprLog(http, 6, "Response code %d, content len %d", code, contentLen); if (http->response) { if (showCode) { mprPrintf(http, "%d\n", code); } if (showHeaders) { responseHeaders = mprGetHttpHeaders(http); resp = http->response; mprPrintf(http, "%s %d %s\n", resp->protocol, resp->code, resp->message); mprPrintf(http, "%s\n", responseHeaders); mprFree(responseHeaders); } } if (code < 0) { mprError(http, "Can't process request for \"%s\" %s", url, mprGetHttpError(http)); return MPR_ERR_CANT_READ; } else if (code == 0 && http->protocolVersion == 0) { ; } else if (!(200 <= code && code <= 206) && !(301 <= code && code <= 304)) { if (!showCode) { mprError(http, "Can't process request for \"%s\" (%d) %s", url, code, mprGetHttpError(http)); return MPR_ERR_CANT_READ; } } lock(); if (verbose && noout) { trace(http, url, fetchCount, method, code, (int) contentLen); } unlock(); return 0; }