int main(int argc, char **argv, char **envp) #endif { char *cp, *method; int i, j, err; err = 0; outputArgs = outputQuery = outputEnv = outputPost = 0; outputBytes = outputHeaderLines = responseStatus = 0; outputLocation = 0; nonParsedHeader = 0; responseMsg = 0; hasError = 0; timeout = 0; queryBuf = 0; queryLen = 0; numQueryKeys = numPostKeys = 0; originalArgc = argc; originalArgv = argv; #if _WIN32 && !WINCE _setmode(0, O_BINARY); _setmode(1, O_BINARY); _setmode(2, O_BINARY); #endif if (strstr(argv[0], "nph-") != 0) { nonParsedHeader++; } if (getArgv(&argc, &argv, originalArgc, originalArgv) < 0) { error("Can't read CGI input"); } for (i = 1; i < argc; i++) { if (argv[i][0] != '-') { continue; } for (cp = &argv[i][1]; *cp; cp++) { switch (*cp) { case 'a': outputArgs++; break; case 'b': if (++i >= argc) { err = __LINE__; } else { outputBytes = atoi(argv[i]); } break; case 'e': outputEnv++; break; case 'h': if (++i >= argc) { err = __LINE__; } else { outputHeaderLines = atoi(argv[i]); nonParsedHeader++; } break; case 'l': if (++i >= argc) { err = __LINE__; } else { outputLocation = argv[i]; if (responseStatus == 0) { responseStatus = 302; } } break; case 'n': nonParsedHeader++; break; case 'p': outputPost++; break; case 'q': outputQuery++; break; case 's': if (++i >= argc) { err = __LINE__; } else { responseStatus = atoi(argv[i]); } break; case 't': if (++i >= argc) { err = __LINE__; } else { timeout = atoi(argv[i]); } break; default: err = __LINE__; break; } } } if (err) { fprintf(stderr, "usage: cgiProgram -aenp [-b bytes] [-h lines]\n" "\t[-l location] [-s status] [-t timeout]\n" "\tor set the HTTP_SWITCHES environment variable\n"); fprintf(stderr, "Error at cgiProgram:%d\n", __LINE__); exit(255); } if ((method = getenv("REQUEST_METHOD")) != 0 && strcmp(method, "POST") == 0) { if (getPostData(&postBuf, &postBufLen) < 0) { error("Can't read CGI input"); } if (strcmp(safeGetenv("CONTENT_TYPE"), "application/x-www-form-urlencoded") == 0) { numPostKeys = getVars(&postKeys, postBuf, postBufLen); } } if (hasError) { if (! nonParsedHeader) { printf("HTTP/1.0 %d %s\r\n\r\n", responseStatus, responseMsg); printf("<HTML><BODY><p>Error: %d -- %s</p></BODY></HTML>\r\n", responseStatus, responseMsg); } fprintf(stderr, "cgiProgram: ERROR: %s\n", responseMsg); exit(2); } if (nonParsedHeader) { if (responseStatus == 0) { printf("HTTP/1.0 200 OK\r\n"); } else { printf("HTTP/1.0 %d %s\r\n", responseStatus, responseMsg ? responseMsg: ""); } printf("Connection: close\r\n"); printf("X-CGI-CustomHeader: Any value at all\r\n"); } printf("Content-type: %s\r\n", "text/html"); if (outputHeaderLines) { for (i = 0; i < outputHeaderLines; i++) { printf("X-CGI-%d: A loooooooooooooooooooooooong string\r\n", i); } } if (outputLocation) { printf("Location: %s\r\n", outputLocation); } if (responseStatus) { printf("Status: %d\r\n", responseStatus); } printf("\r\n"); if ((outputBytes + outputArgs + outputEnv + outputQuery + outputPost + outputLocation + responseStatus) == 0) { outputArgs++; outputEnv++; outputQuery++; outputPost++; } if (outputBytes) { j = 0; for (i = 0; i < outputBytes; i++) { putchar('0' + j); j++; if (j > 9) { if (++outputBytes > 0) { putchar('\r'); } if (++outputBytes > 0) { putchar('\n'); } j = 0; } } } printf("<HTML><TITLE>cgiProgram: Output</TITLE><BODY>\r\n"); if (outputArgs) { #if _WIN32 printf("<P>CommandLine: %s</P>\r\n", GetCommandLine()); #endif printf("<H2>Args</H2>\r\n"); for (i = 0; i < argc; i++) { printf("<P>ARG[%d]=%s</P>\r\n", i, argv[i]); } } printEnv(envp); if (outputQuery) { printQuery(); } if (outputPost) { printPost(postBuf, postBufLen); } printf("</BODY></HTML>\r\n"); #if VXWORKS /* VxWorks pipes need an explicit eof string Must not call exit(0) in Vxworks as that will exit the task before the CGI handler can cleanup. Must use return 0. */ write(1, MPR_CMD_VXWORKS_EOF, MPR_CMD_VXWORKS_EOF_LEN); write(2, MPR_CMD_VXWORKS_EOF, MPR_CMD_VXWORKS_EOF_LEN); #endif fflush(stderr); fflush(stdout); return 0; }
static void printEnv(char **envp) { printf("<H2>Environment Variables</H2>\r\n"); printf("<P>AUTH_TYPE=%s</P>\r\n", safeGetenv("AUTH_TYPE")); printf("<P>CONTENT_LENGTH=%s</P>\r\n", safeGetenv("CONTENT_LENGTH")); printf("<P>CONTENT_TYPE=%s</P>\r\n", safeGetenv("CONTENT_TYPE")); printf("<P>DOCUMENT_ROOT=%s</P>\r\n", safeGetenv("DOCUMENT_ROOT")); printf("<P>GATEWAY_INTERFACE=%s</P>\r\n", safeGetenv("GATEWAY_INTERFACE")); printf("<P>HTTP_ACCEPT=%s</P>\r\n", safeGetenv("HTTP_ACCEPT")); printf("<P>HTTP_CONNECTION=%s</P>\r\n", safeGetenv("HTTP_CONNECTION")); printf("<P>HTTP_HOST=%s</P>\r\n", safeGetenv("HTTP_HOST")); printf("<P>HTTP_USER_AGENT=%s</P>\r\n", safeGetenv("HTTP_USER_AGENT")); printf("<P>PATH_INFO=%s</P>\r\n", safeGetenv("PATH_INFO")); printf("<P>PATH_TRANSLATED=%s</P>\r\n", safeGetenv("PATH_TRANSLATED")); printf("<P>QUERY_STRING=%s</P>\r\n", safeGetenv("QUERY_STRING")); printf("<P>REMOTE_ADDR=%s</P>\r\n", safeGetenv("REMOTE_ADDR")); printf("<P>REQUEST_METHOD=%s</P>\r\n", safeGetenv("REQUEST_METHOD")); printf("<P>REQUEST_URI=%s</P>\r\n", safeGetenv("REQUEST_URI")); printf("<P>REMOTE_USER=%s</P>\r\n", safeGetenv("REMOTE_USER")); printf("<P>SCRIPT_NAME=%s</P>\r\n", safeGetenv("SCRIPT_NAME")); printf("<P>SCRIPT_FILENAME=%s</P>\r\n", safeGetenv("SCRIPT_FILENAME")); printf("<P>SERVER_ADDR=%s</P>\r\n", safeGetenv("SERVER_ADDR")); printf("<P>SERVER_NAME=%s</P>\r\n", safeGetenv("SERVER_NAME")); printf("<P>SERVER_PORT=%s</P>\r\n", safeGetenv("SERVER_PORT")); printf("<P>SERVER_PROTOCOL=%s</P>\r\n", safeGetenv("SERVER_PROTOCOL")); printf("<P>SERVER_SOFTWARE=%s</P>\r\n", safeGetenv("SERVER_SOFTWARE")); #if !VXWORKS /* This is not supported on VxWorks as you can't get "envp" in main() */ printf("\r\n<H2>All Defined Environment Variables</H2>\r\n"); if (envp) { char *p; int i; for (i = 0, p = envp[0]; envp[i]; i++) { p = envp[i]; printf("<P>%s</P>\r\n", p); } } #endif printf("\r\n"); }
static void printEnv(char **envp) { mprPrintf(mpr, "<H2>Environment Variables</H2>\r\n"); mprPrintf(mpr, "<P>AUTH_TYPE=%s</P>\r\n", safeGetenv("AUTH_TYPE")); mprPrintf(mpr, "<P>CONTENT_LENGTH=%s</P>\r\n", safeGetenv("CONTENT_LENGTH")); mprPrintf(mpr, "<P>CONTENT_TYPE=%s</P>\r\n", safeGetenv("CONTENT_TYPE")); mprPrintf(mpr, "<P>DOCUMENT_ROOT=%s</P>\r\n", safeGetenv("DOCUMENT_ROOT")); mprPrintf(mpr, "<P>GATEWAY_INTERFACE=%s</P>\r\n", safeGetenv("GATEWAY_INTERFACE")); mprPrintf(mpr, "<P>HTTP_ACCEPT=%s</P>\r\n", safeGetenv("HTTP_ACCEPT")); mprPrintf(mpr, "<P>HTTP_CONNECTION=%s</P>\r\n", safeGetenv("HTTP_CONNECTION")); mprPrintf(mpr, "<P>HTTP_HOST=%s</P>\r\n", safeGetenv("HTTP_HOST")); mprPrintf(mpr, "<P>HTTP_USER_AGENT=%s</P>\r\n", safeGetenv("HTTP_USER_AGENT")); mprPrintf(mpr, "<P>PATH_INFO=%s</P>\r\n", safeGetenv("PATH_INFO")); mprPrintf(mpr, "<P>PATH_TRANSLATED=%s</P>\r\n", safeGetenv("PATH_TRANSLATED")); mprPrintf(mpr, "<P>QUERY_STRING=%s</P>\r\n", safeGetenv("QUERY_STRING")); mprPrintf(mpr, "<P>REMOTE_ADDR=%s</P>\r\n", safeGetenv("REMOTE_ADDR")); mprPrintf(mpr, "<P>REMOTE_HOST=%s</P>\r\n", safeGetenv("REMOTE_HOST")); mprPrintf(mpr, "<P>REQUEST_METHOD=%s</P>\r\n", safeGetenv("REQUEST_METHOD")); mprPrintf(mpr, "<P>REQUEST_URI=%s</P>\r\n", safeGetenv("REQUEST_URI")); mprPrintf(mpr, "<P>REMOTE_USER=%s</P>\r\n", safeGetenv("REMOTE_USER")); mprPrintf(mpr, "<P>SCRIPT_NAME=%s</P>\r\n", safeGetenv("SCRIPT_NAME")); mprPrintf(mpr, "<P>SERVER_ADDR=%s</P>\r\n", safeGetenv("SERVER_ADDR")); mprPrintf(mpr, "<P>SERVER_HOST=%s</P>\r\n", safeGetenv("SERVER_HOST")); mprPrintf(mpr, "<P>SERVER_NAME=%s</P>\r\n", safeGetenv("SERVER_NAME")); mprPrintf(mpr, "<P>SERVER_PORT=%s</P>\r\n", safeGetenv("SERVER_PORT")); mprPrintf(mpr, "<P>SERVER_PROTOCOL=%s</P>\r\n", safeGetenv("SERVER_PROTOCOL")); mprPrintf(mpr, "<P>SERVER_SOFTWARE=%s</P>\r\n", safeGetenv("SERVER_SOFTWARE")); mprPrintf(mpr, "<P>SERVER_URL=%s</P>\r\n", safeGetenv("SERVER_URL")); mprPrintf(mpr, "\r\n<H2>All Defined Environment Variables</H2>\r\n"); if (envp) { char *p; int i; for (i = 0, p = envp[0]; envp[i]; i++) { p = envp[i]; mprPrintf(mpr, "<P>%s</P>\r\n", p); } } mprPrintf(mpr, "\r\n"); }