static ssize readStringData(MprXml *xp, void *data, char *buf, ssize size) { EjsXmlState *parser; ssize len, rc; assert(xp); assert(buf); assert(size > 0); parser = (EjsXmlState*) xp->parseArg; if (parser->inputPos < parser->inputSize) { len = min(size, (parser->inputSize - parser->inputPos)); rc = mprMemcpy(buf, size, &parser->inputBuf[parser->inputPos], len); parser->inputPos += len; return rc; } return 0; }
/* * Get a request and parse environment and request URI. Given: * * http /simple.cgi/abc/def?a=b&c=d * DOCUMENT_ROOT=/Users/mob/hg/appweb/src/server/web * GATEWAY_INTERFACE=CGI/1.1 * CONTENT_LENGTH=NNN * CONTENT_TYPE * PATH_INFO=/abc/def * PATH_TRANSLATED=/Users/mob/hg/appweb/src/server/web/ab/def * QUERY_STRING=a=b&c=d * REMOTE_ADDR=10.0.0.1234 * REMOTE_HOST * REMOTE_PORT * REQUEST_URI=/simple.cgi * REQUEST_METHOD=GET * REQUEST_TRANSPORT=http * SCRIPT_FILENAME=/Users/mob/hg/appweb/src/server/web/simple.cgi * SERVER_NAME=127.0.0.1:7777 * SERVER_PORT=7777 * SERVER_SOFTWARE=Embedthis-Appweb/3.0A.1 * SERVER_PROTOCOL=http * HTTP_ACCEPT= * HTTP_COOKIE= * HTTP_REFERRER= * HTTP_CONNECTION=Keep-Alive * HTTP_HOST=127.0.0.1 * HTTP_USER_AGENT=Embedthis-http/3.0A.1 * HTTPS * HTTP_* * PATH= */ static int getRequest() { char key[MPR_MAX_STRING], *ep, *cp, *value; int len, i; formVars = mprCreateHash(mpr, EJS_CGI_HDR_HASH); requestHeaders = mprCreateHash(mpr, EJS_CGI_HDR_HASH); responseHeaders = mprCreateHash(mpr, EJS_CGI_HDR_HASH); if (debug) { debugFile = fopen("/tmp/ejscgi.log", "w+"); } for (i = 0; environ && environ[i]; i++) { if ((ep = environ[i]) == 0) { continue; } if ((cp = strchr(ep, '=')) != 0) { len = cp - ep; mprMemcpy(key, sizeof(key), ep, len); key[len] = '\0'; mprAddHash(requestHeaders, key, ++cp); if (debugFile) { fprintf(debugFile, "%-20s = %s\n", key, cp); } } } if (debugFile) { fclose(debugFile); debugFile = 0; } #if BLD_DEBUG if (dummy) { mprAddHash(requestHeaders, "SCRIPT_NAME", mprStrdup(mpr, "/cgi/ejscgi")); mprAddHash(requestHeaders, "DOCUMENT_ROOT", mprStrdup(mpr, "/Users/mob/hg/carmen")); mprAddHash(requestHeaders, "PATH_TRANSLATED", mprStrdup(mpr, "/Users/mob/hg/carmen")); mprAddHash(requestHeaders, "QUERY_STRING", mprStrdup(mpr, "a=b&c=d")); mprAddHash(requestHeaders, "PATH_INFO", mprStrdup(mpr, "/carmen/stock/")); mprAddHash(requestHeaders, "REQUEST_URI", mprStrdup(mpr, "/cgi-bin/ejscgi/carmen/stock/")); // mprAddHash(requestHeaders, "PATH_INFO", mprStrdup(mpr, "/carmen/web/style.css")); // mprAddHash(requestHeaders, "REQUEST_URI", mprStrdup(mpr, "/cgi-bin/ejscgi/carmen/web/style.css")); // mprAddHash(requestHeaders, "PATH_INFO", mprStrdup(mpr, "/carmen/web/images/banner.jpg")); // mprAddHash(requestHeaders, "REQUEST_URI", mprStrdup(mpr, "/cgi-bin/ejscgi/carmen/web/images/banner.jpg")); } #endif documentRoot = (char*) mprLookupHash(requestHeaders, "DOCUMENT_ROOT"); cookie = (char*) mprLookupHash(requestHeaders, "HTTP_COOKIE"); contentType = (char*) mprLookupHash(requestHeaders, "CONTENT_TYPE"); query = (char*) mprLookupHash(requestHeaders, "QUERY_STRING"); pathTranslated = (char*) mprLookupHash(requestHeaders, "PATH_TRANSLATED"); pathInfo = (char*) mprLookupHash(requestHeaders, "PATH_INFO"); scriptName = (char*) mprLookupHash(requestHeaders, "SCRIPT_NAME"); uri = (char*) mprLookupHash(requestHeaders, "REQUEST_URI"); if (documentRoot == 0 || pathInfo == 0 || scriptName == 0 || uri == 0) { error(NULL, 0, "CGI environment not setup correctly"); return EJS_ERR; } value = (char*) mprLookupHash(requestHeaders, "CONTENT_LENGTH"); if (value) { contentLength = atoi(value); } ext = strrchr(uri, '.'); if (createFormData() < 0) { return EJS_ERR; } return 0; }
/* Grid is modified. Columns are removed and sorted as required. */ static void filterCols(EdiGrid *grid, MprHash *options, MprHash *colOptions) { MprList *gridCols; MprHash *cp; EdiRec *rec; EdiField f; cchar *columnName; char key[8]; int ncols, r, fnum, currentPos, c, index, *desired, *location, pos, t; gridCols = ediGetGridColumns(grid); if (colOptions) { /* Sort grid record columns into the order specified by the column options */ ncols = grid->records[0]->nfields; location = mprAlloc(sizeof(int) * ncols); for (c = 0; c < ncols; c++) { location[c] = c; } ncols = mprGetHashLength(colOptions); desired = mprAlloc(sizeof(int) * ncols); for (c = 0; c < ncols; c++) { cp = mprLookupKey(colOptions, itosbuf(key, sizeof(key), c, 10)); if ((columnName = mprLookupKey(cp, "name")) == 0) { mprError("Cannot locate \"name\" field for column in table"); return; } pos = mprLookupStringItem(gridCols, columnName); if (pos < 0) { mprError("Cannot find column \"%s\", columns: %s", columnName, mprListToString(gridCols, ", ")); } else { desired[c] = pos; location[c] = c; } } for (c = 0; c < ncols; c++) { fnum = c; for (r = 0; r < grid->nrecords; r++) { rec = grid->records[r]; rec->nfields = ncols; fnum = desired[c]; if (fnum < 0) { continue; } currentPos = location[fnum]; f = rec->fields[c]; rec->fields[c] = rec->fields[currentPos]; rec->fields[currentPos] = f; } t = location[c]; location[c] = location[fnum]; location[fnum] = t; } } else { /* If showId is false, remove the "id" column */ if (httpOption(options, "showId", "false", 0) && (index = mprLookupStringItem(gridCols, "id")) >= 0) { for (r = 0; r < grid->nrecords; r++) { rec = grid->records[r]; rec->nfields--; mprMemcpy(rec->fields, sizeof(EdiField) * rec->nfields, &rec->fields[index], sizeof(EdiField) * (rec->nfields - 1)); } } } }