static void printQueryData(MaQueue *q) { MaRequest *req; char buf[MPR_MAX_STRING], **keys, *value; int i, numKeys; req = q->conn->request; if (req->parsedUri->query == 0) { return; } mprStrcpy(buf, sizeof(buf), req->parsedUri->query); numKeys = getVars(q, &keys, buf, (int) strlen(buf)); if (numKeys == 0) { maWrite(q, "<H2>No Query Data Found</H2>\r\n"); } else { maWrite(q, "<H2>Decoded Query Data Variables</H2>\r\n"); for (i = 0; i < (numKeys * 2); i += 2) { value = keys[i+1]; maWrite(q, "<p>QVAR %s=%s</p>\r\n", keys[i], value ? value: ""); } } maWrite(q, "\r\n"); mprFree(keys); }
static void printBodyData(MaQueue *q) { MprBuf *buf; char **keys, *value; int i, numKeys; if (q->pair == 0 || q->pair->first == 0) { return; } buf = q->pair->first->content; mprAddNullToBuf(buf); numKeys = getVars(q, &keys, mprGetBufStart(buf), mprGetBufLength(buf)); if (numKeys == 0) { maWrite(q, "<H2>No Body Data Found</H2>\r\n"); } else { maWrite(q, "<H2>Decoded Body Data</H2>\r\n"); for (i = 0; i < (numKeys * 2); i += 2) { value = keys[i+1]; maWrite(q, "<p>PVAR %s=%s</p>\r\n", keys[i], value ? value: ""); } } maWrite(q, "\r\n"); mprFree(keys); mprFree(buf); }
static void upload(MaQueue *q) { MaConn *conn; char *sw; char *newLocation; int responseStatus; conn = q->conn; newLocation = 0; responseStatus = 0; sw = (char*) strstr(maGetFormVar(conn, "QUERY_STRING", ""), "SWITCHES="); if (sw) { sw = mprStrdup(q, sw + 9); mprUrlDecode(sw, (int) strlen(sw) + 1, sw); if (*sw == '-') { if (sw[1] == 'l') { newLocation = sw + 3; } else if (sw[1] == 's') { responseStatus = atoi(sw + 3); } } } maSetResponseCode(conn, 200); maSetResponseMimeType(conn, "text/html"); maDontCacheResponse(conn); /* * Test writing headers. The Server header overwrote the "Server" header * * maSetHeader(conn, "MyCustomHeader: true"); * maSetHeader(conn, "Server: private"); */ if (maGetCookies(conn) == 0) { maSetCookie(conn, "appwebTest", "Testing can be fun", 43200, "/", 0); } if (newLocation) { maRedirect(conn, 302, newLocation); } else if (responseStatus) { maFailRequest(conn, responseStatus, "Custom Status"); } else { maWrite(q, "<HTML><TITLE>egiProgram: EGI Output</TITLE><BODY>\r\n"); printRequestHeaders(q); printQueryData(q); printBodyData(q); maWrite(q, "</BODY></HTML>\r\n"); } if (sw) { mprFree(sw); } }
static void printRequestHeaders(MaQueue *q) { MprHashTable *env; MprHash *hp; maWrite(q, "<H2>Request Headers</H2>\r\n"); env = q->conn->request->headers; for (hp = 0; (hp = mprGetNextHash(env, hp)) != 0; ) { maWrite(q, "<P>%s=%s</P>\r\n", hp->key, hp->data ? hp->data: ""); } maWrite(q, "\r\n"); }
static void bigTest(MaQueue *q) { int i; for (i = 0; i < 200; i++) { maWrite(q, "line %04d 012345678901234567890123456789012345678901234567890123456789\r\n", i); } }
static void runDir(MaQueue *q) { MaConn *conn; MaResponse *resp; MaRequest *req; MprList *list; MprDirEntry *dp; Dir *dir; cchar *filename; uint nameSize; int next; conn = q->conn; req = conn->request; resp = conn->response; dir = q->stage->stageData; filename = resp->filename; mprAssert(filename); maDontCacheResponse(conn); maSetHeader(conn, 0, "Last-Modified", req->host->currentDate); maPutForService(q, maCreateHeaderPacket(q), 0); parseQuery(conn); list = mprGetPathFiles(conn, filename, 1); if (list == 0) { maWrite(q, "<h2>Can't get file list</h2>\r\n"); outputFooter(q); return; } if (dir->pattern) { filterDirList(conn, list); } sortList(conn, list); /* * Get max filename */ nameSize = 0; for (next = 0; (dp = mprGetNextItem(list, &next)) != 0; ) { nameSize = max((int) strlen(dp->name), nameSize); } nameSize = max(nameSize, 22); outputHeader(q, req->url, nameSize); for (next = 0; (dp = mprGetNextItem(list, &next)) != 0; ) { outputLine(q, dp, filename, nameSize); } outputFooter(q); maPutForService(q, maCreateEndPacket(conn), 1); mprFree(list); }
static void myEgi(MaQueue *q) { MaConn *conn; conn = q->conn; maSetResponseCode(conn, 200); maWrite(q, "<HTML><TITLE>simpleEgi</TITLE><BODY>\r\n"); maWrite(q, "<p>Name: %s</p>\n", maGetFormVar(conn, "name", "-")); maWrite(q, "<p>Address: %s</p>\n", maGetFormVar(conn, "address", "-")); maWrite(q, "</BODY></HTML>\r\n"); #if POSSIBLE /* * Useful things to do in egi forms */ maSetResponseCode(conn, 200); maSetResponseMimeType(conn, "text/plain"); maDontCacheResponse(conn); maRedirect(conn, 302, "/myURl"); maFailRequest(conn, 409, "My message : %d", 5); #endif }
static void outputFooter(MaQueue *q) { MaRequest *req; MaConn *conn; MprSocket *sock; Dir *dir; conn = q->conn; req = conn->request; dir = q->stage->stageData; if (dir->fancyIndexing == 2) { maWrite(q, "<tr><th colspan=\"5\"><hr /></th></tr>\r\n</table>\r\n"); } else if (dir->fancyIndexing == 1) { maWrite(q, "<hr /></pre>\r\n"); } else { maWrite(q, "</ul>\r\n"); } sock = conn->sock->listenSock; maWrite(q, "<address>%s %s at %s Port %d</address>\r\n", BLD_NAME, BLD_VERSION, sock->ipAddr, sock->port); maWrite(q, "</body></html>\r\n"); }
static void simpleTest(MaQueue *q) { maWrite(q, "Hello %s\r\n", maGetFormVar(q->conn, "name", "unknown")); }
static void outputLine(MaQueue *q, MprDirEntry *ep, cchar *path, int nameSize) { MprPath info; Dir *dir; MprTime when; MaHost *host; char *newPath, sizeBuf[16], timeBuf[48], *icon; struct tm tm; bool isDir; int len; cchar *ext, *mimeType; char *dirSuffix; char *months[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; dir = q->stage->stageData; if (ep->size >= (1024*1024*1024)) { fmtNum(sizeBuf, sizeof(sizeBuf), (int) ep->size, 1024 * 1024 * 1024, "G"); } else if (ep->size >= (1024*1024)) { fmtNum(sizeBuf, sizeof(sizeBuf), (int) ep->size, 1024 * 1024, "M"); } else if (ep->size >= 1024) { fmtNum(sizeBuf, sizeof(sizeBuf), (int) ep->size, 1024, "K"); } else { mprSprintf(sizeBuf, sizeof(sizeBuf), "%6d", (int) ep->size); } newPath = mprJoinPath(q, path, ep->name); if (mprGetPathInfo(q, newPath, &info) < 0) { when = mprGetTime(q); isDir = 0; } else { isDir = info.isDir ? 1 : 0; when = (MprTime) info.mtime * MPR_TICKS_PER_SEC; } mprFree(newPath); if (isDir) { icon = "folder"; dirSuffix = "/"; } else { host = q->conn->host; ext = mprGetPathExtension(q, ep->name); if ((mimeType = maLookupMimeType(host, ext)) != 0) { if (strcmp(ext, "es") == 0 || strcmp(ext, "ejs") == 0 || strcmp(ext, "php") == 0) { icon = "text"; } else if (strstr(mimeType, "text") != 0) { icon = "text"; } else { icon = "compressed"; } } else { icon = "compressed"; } dirSuffix = ""; } mprDecodeLocalTime(q, &tm, when); mprSprintf(timeBuf, sizeof(timeBuf), "%02d-%3s-%4d %02d:%02d", tm.tm_mday, months[tm.tm_mon], tm.tm_year + 1900, tm.tm_hour, tm.tm_min); len = (int) strlen(ep->name) + (int) strlen(dirSuffix); if (dir->fancyIndexing == 2) { maWrite(q, "<tr><td valign=\"top\">"); maWrite(q, "<img src=\"/icons/%s.gif\" alt=\"[ ]\", /></td>", icon); maWrite(q, "<td><a href=\"%s%s\">%s%s</a></td>", ep->name, dirSuffix, ep->name, dirSuffix); maWrite(q, "<td>%s</td><td>%s</td></tr>\r\n", timeBuf, sizeBuf); } else if (dir->fancyIndexing == 1) { maWrite(q, "<img src=\"/icons/%s.gif\" alt=\"[ ]\", /> ", icon); maWrite(q, "<a href=\"%s%s\">%s%s</a>%-*s %17s %4s\r\n", ep->name, dirSuffix, ep->name, dirSuffix, nameSize - len, "", timeBuf, sizeBuf); } else { maWrite(q, "<li><a href=\"%s%s\"> %s%s</a></li>\r\n", ep->name, dirSuffix, ep->name, dirSuffix); } }
static void outputHeader(MaQueue *q, cchar *path, int nameSize) { Dir *dir; char *parent, *parentSuffix; int order, reverseOrder, fancy, isRootDir, sep; dir = q->stage->stageData; fancy = 1; maWrite(q, "<!DOCTYPE HTML PUBLIC \"-/*W3C//DTD HTML 3.2 Final//EN\">\r\n"); maWrite(q, "<html>\r\n <head>\r\n <title>Index of %s</title>\r\n", path); maWrite(q, " </head>\r\n"); maWrite(q, "<body>\r\n"); maWrite(q, "<h1>Index of %s</h1>\r\n", path); if (dir->sortOrder > 0) { order = 'A'; reverseOrder = 'D'; } else { order = 'D'; reverseOrder = 'A'; } if (dir->fancyIndexing == 0) { fancy = '0'; } else if (dir->fancyIndexing == 1) { fancy = '1'; } else if (dir->fancyIndexing == 2) { fancy = '2'; } parent = mprGetPathDir(q, path); sep = mprGetPathSeparator(q, parent); if (parent[strlen(parent) - 1] != sep) { parentSuffix = "/"; } else { parentSuffix = ""; } isRootDir = (strcmp(path, "/") == 0); if (dir->fancyIndexing == 2) { maWrite(q, "<table><tr><th><img src=\"/icons/blank.gif\" alt=\"[ICO]\" /></th>"); maWrite(q, "<th><a href=\"?C=N;O=%c;F=%c\">Name</a></th>", reverseOrder, fancy); maWrite(q, "<th><a href=\"?C=M;O=%c;F=%c\">Last modified</a></th>", reverseOrder, fancy); maWrite(q, "<th><a href=\"?C=S;O=%c;F=%c\">Size</a></th>", reverseOrder, fancy); maWrite(q, "<th><a href=\"?C=D;O=%c;F=%c\">Description</a></th>\r\n", reverseOrder, fancy); maWrite(q, "</tr><tr><th colspan=\"5\"><hr /></th></tr>\r\n"); if (! isRootDir) { maWrite(q, "<tr><td valign=\"top\"><img src=\"/icons/back.gif\""); maWrite(q, "alt=\"[DIR]\" /></td><td><a href=\"%s%s\">", parent, parentSuffix); maWrite(q, "Parent Directory</a></td>"); maWrite(q, "<td align=\"right\"> - </td></tr>\r\n"); } } else if (dir->fancyIndexing == 1) { maWrite(q, "<pre><img src=\"/icons/space.gif\" alt=\"Icon\" /> "); maWrite(q, "<a href=\"?C=N;O=%c;F=%c\">Name</a>%*s", reverseOrder, fancy, nameSize - 3, " "); maWrite(q, "<a href=\"?C=M;O=%c;F=%c\">Last modified</a> ", reverseOrder, fancy); maWrite(q, "<a href=\"?C=S;O=%c;F=%c\">Size</a> ", reverseOrder, fancy); maWrite(q, "<a href=\"?C=D;O=%c;F=%c\">Description</a>\r\n", reverseOrder, fancy); maWrite(q, "<hr />"); if (! isRootDir) { maWrite(q, "<img src=\"/icons/parent.gif\" alt=\"[DIR]\" />"); maWrite(q, " <a href=\"%s%s\">Parent Directory</a>\r\n", parent, parentSuffix); } } else { maWrite(q, "<ul>\n"); if (! isRootDir) { maWrite(q, "<li><a href=\"%s%s\"> Parent Directory</a></li>\r\n", parent, parentSuffix); } } mprFree(parent); }