/* * * ProLinga-Web * * Copyright (C) 2002-2008 Xobas Software. * All rights reserved. * * This file is part of ProLinga-Web. * * ProLinga-Web is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * ProLinga-Web is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with ProLinga-Web. If not, see . * * More information is available at the following addresses: * * Website : http://www.prolinga.org * * Email : prolinga-list@prolinga.org * * */ #include "WebCommon.h" #include #include #include "WCWebCommand.hpp" #include "WebProcess.hpp" #include "GetCgiVars.hpp" /* The following code (x2c) was lifted from NCSA's sample program util.c */ /* Convert a two-char hex string into the char it represents. */ char x2c(char *what) { register char digit; digit = (what[0] >= 'A' ? ((what[0] & 0xdf) - 'A')+10 : (what[0] - '0')); digit *= 16; digit += (what[1] >= 'A' ? ((what[1] & 0xdf) - 'A')+10 : (what[1] - '0')); return(digit); } /* The following code (unescape_url) was lifted from NCSA's sample program util.c */ /* Reduce any %xx escape sequences to the characters they represent. */ void unescape_url(char *url) { register int i,j; for(i=0,j=0; url[j]; ++i,++j) { if((url[i] = url[j]) == '%') { url[i] = x2c(&url[j+1]); j+= 2; } } url[i] = '\0' ; } /* The following code (getcgivars) was written by James Marshall */ /* http://www.jmarshall.com/easy/cgi/ */ /* Read the CGI input and place all name/val pairs into list. */ /* Returns list containing name1, value1, name2, value2, ... , NULL */ char **GetCgiVars() { register int i; char *request_method; int content_length; char *cgiinput; char **cgivars; char **pairlist; int paircount; char *nvpair; char *eqpos; /** Depending on the request method, read all CGI input into cgiinput. **/ request_method= getenv("REQUEST_METHOD"); if (!strcmp(request_method, "GET") || !strcmp(request_method, "HEAD") ) { /* Some servers apparently don't provide QUERY_STRING if it's empty, */ /* so avoid strdup()'ing a NULL pointer here. */ char *qs ; qs= getenv("QUERY_STRING") ; cgiinput= strdup(qs ? qs : "") ; } else if (!strcmp(request_method, "POST")) { /* strcasecmp() is not supported in Windows-- use strcmpi() instead */ if ( strcasecmp(getenv("CONTENT_TYPE"), "application/x-www-form-urlencoded")) { printf("Content-Type: text/plain\n\n"); printf("getcgivars(): Unsupported Content-Type.\n"); exit(1); } if ( !(content_length = atoi(getenv("CONTENT_LENGTH"))) ) { printf("Content-Type: text/plain\n\n"); printf("getcgivars(): No Content-Length was sent with the POST request.\n"); exit(1); } if ( !(cgiinput= (char *) malloc(content_length+1)) ) { printf("Content-Type: text/plain\n\n"); printf("getcgivars(): Couldn't malloc for cgiinput.\n"); exit(1); } if (!fread(cgiinput, content_length, 1, stdin)) { printf("Content-Type: text/plain\n\n"); printf("getcgivars(): Couldn't read CGI input from STDIN.\n"); exit(1); } cgiinput[content_length]='\0'; } else { printf("Content-Type: text/plain\n\n"); printf("getcgivars(): Unsupported REQUEST_METHOD.\n"); exit(1); } /** Change all plusses back to spaces. **/ for (i=0; cgiinput[i]; i++) if (cgiinput[i] == '+') cgiinput[i] = ' ' ; /** First, split on "&" and ";" to extract the name-value pairs into **/ /** pairlist. **/ pairlist= (char **) malloc(256*sizeof(char **)); paircount= 0; nvpair= strtok(cgiinput, "&;"); while (nvpair) { pairlist[paircount++]= strdup(nvpair); if (!(paircount%256)) pairlist= (char **) realloc(pairlist,(paircount+256)*sizeof(char **)); nvpair= strtok(NULL, "&;"); } pairlist[paircount]= 0 ; /* terminate the list with NULL */ /** Then, from the list of pairs, extract the names and values. **/ cgivars= (char **) malloc((paircount*2+1)*sizeof(char **)); for (i= 0; i