Exemple #1
0
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;
}
Exemple #2
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;
}
Exemple #3
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));
            }
        }
    }
}