📄 cgi.c
字号:
fprintf(fp, "%s\n", cgiEnv.scriptName);
fprintf(fp, "%s\n", cgiEnv.serverName);
fprintf(fp, "%s\n", cgiEnv.serverPort);
fprintf(fp, "%s\n", cgiEnv.serverProtocol);
fprintf(fp, "%s\n", cgiEnv.serverSoftware);
fclose(fp);
return 1;
}
/******************************************************************************
**
** Function cgiDecodeUrl
**
** Purpose Decode a URL-envoded string (plus to space, hex to ascii)
**
** History Date Author Modification
** 08-03-96 JEM First Draft
** 06-12-96 JEM Bug fix. Due to differing compiler precedence
** rules, *++i had to be changed.
**
******************************************************************************/
static char *cgiDecodeUrl(char *data)
{
char *i, *j;
for (j=i=data; *i!='\0'; i++, j++)
{
if (*i == '%')
{
*j = cgiHexAsc(*(i+1), *(i+2));
i += 2;
}
else
if (*i == '+')
*j = ' ';
else
*j = *i;
}
*j = '\0';
return data;
}
/******************************************************************************
**
** Function cgiFormAdd
**
** Purpose Add a form pair to the internal linked list
**
** History Date Author Modification
** 15-03-96 JEM First Draft
**
******************************************************************************/
static int cgiFormAdd(char *var, char *val)
{
if (!(form.pair))
form.pair = (pair_t*)malloc((form.size+1)*sizeof(pair_t));
else
form.pair = (pair_t*)realloc(form.pair, (form.size+1)*sizeof(pair_t));
if (!(form.pair))
return 0;
if (!(form.pair[form.size].var = cgiStrdup(var)) ||
!(form.pair[form.size].val = cgiStrdup(val)))
return 0;
++form.size;
return 1;
}
/******************************************************************************
**
** Function cgiGetEnv
**
** Purpose
**
** History Date Author Modification
** 06-03-96 JEM First Draft
**
******************************************************************************/
static char *cgiGetEnv(char *var)
{
char *val = getenv(var);
return (val) ? (val) : "";
}
/******************************************************************************
**
** Function cgiGetStdin
**
** Purpose Get CGI data from stdin
**
** History Date Author Modification
** 06-03-96 JEM First Draft
**
******************************************************************************/
static char *cgiGetStdin(int len)
{
char *data;
if (!(data = (char*)malloc(len+1)))
return "";
len = fread(data, 1, len, stdin);
data[len]='\0';
return data;
}
/******************************************************************************
**
** Function cgiHexAsc
**
** Purpose Convert two hex values to an ascii character
**
** History Date Author Modification
** 08-03-96 JEM First Draft
**
******************************************************************************/
static char cgiHexAsc(char x1, char x2)
{
return (isxdigit(x1)&&isxdigit(x2))?((cgiHexInt(x1)<<4)+cgiHexInt(x2)):' ';
}
/******************************************************************************
**
** Function cgiHexInt
**
** Purpose Convert a hex value to an integer value
**
** History Date Author Modification
** 08-03-96 JEM First Draft
**
******************************************************************************/
static int cgiHexInt(char x)
{
return (x>='0' && x<='9') ? (x-'0') :
(x>='a' && x<='f') ? (x-'a'+10) :
(x>='A' && x<='F') ? (x-'A'+10) : 0;
}
/******************************************************************************
**
** Function cgiParseArgs
**
** Purpose Get CGI data from commandline arguments
**
** History Date Author Modification
** 06-03-96 JEM First Draft
**
******************************************************************************/
static int cgiParseArgs(char **argv, int argc)
{
int cnt;
for (cnt=1; cnt<argc; cnt++)
if (!cgiFormAdd("isindex", argv[cnt]))
return 0;
return 1;
}
/******************************************************************************
**
** Function cgiParseInput
**
** Purpose Parse CGI data, URL-decode and add pairs to linked list
**
** History Date Author Modification
** 06-03-96 JEM First Draft
**
******************************************************************************/
static int cgiParseInput(char *input, int len)
{
char *var, *val;
int cnt, stPnt=0, eqPnt=0, eqCnt=0, amPnt=0, amCnt=0;
if (!len)
return 1;
for (cnt=0; cnt<=len; cnt++)
{
if (input[cnt] == '=')
{
eqCnt++;
eqPnt = cnt;
}
else
if (input[cnt] == '&' || cnt==len)
{
amCnt++;
amPnt = cnt;
}
if (!eqCnt && amCnt) /* no equal in equal/ampersand pair */
return 0;
else
if (eqCnt>1 || amCnt>1) /* equal/ampersand followed by same */
return 0;
else
if (eqCnt && amCnt)
{
if (stPnt == eqPnt) /* not allowed to have a NULL variable */
return 0;
if (!(var = (char*)calloc(eqPnt-stPnt+1, 1)))
return 0;
memcpy(var, input+stPnt, eqPnt-stPnt);
var = cgiDecodeUrl(var);
if(!(val = (char*)calloc(amPnt-eqPnt, 1)))
return 0;
memcpy(val, input+eqPnt+1, amPnt-eqPnt-1);
val = cgiDecodeUrl(val);
if (!cgiFormAdd(var, val))
return 0;
free(var);
free(val);
eqCnt = amCnt = 0;
stPnt = amPnt+1;
}
}
return 1;
}
/******************************************************************************
**
** Function main
**
** Purpose Main
**
** History Date Author Modification
** 06-03-96 JEM First Draft
** 29-07-96 JEM Fixed error messages, residue from testing
**
******************************************************************************/
int main(int argc, char **argv)
{
int cgiStatus = 0;
if (cgiDebug && strstr(cgiDebug, "LOAD="))
{
if (cgiDebugEnvLoad(strchr(cgiDebug, '=')+1))
{
cgiHeaderStatus(200, "Environment Reload Succeeded",
"CGI debug environment was loaded from file");
cgiPrintf("<HR SIZE=10>");
}
else
{
cgiHeaderStatus(505, "Environment Reload Failed",
"CGI debug environment failed to reload from file");
return 1;
}
}
else
{
cgiArgc = argc;
cgiArgv = argv;
cgiStdin = "";
cgiEnv.authType = cgiGetEnv("AUTH_TYPE");
cgiEnv.contentLength = atoi(cgiGetEnv("CONTENT_LENGTH"));
cgiEnv.contentType = cgiGetEnv("CONTENT_TYPE");
cgiEnv.gatewayInterface = cgiGetEnv("GATEWAY_INTERFACE");
cgiEnv.httpAccept = cgiGetEnv("HTTP_ACCEPT");
cgiEnv.httpHost = cgiGetEnv("HTTP_HOST");
cgiEnv.httpReferer = cgiGetEnv("HTTP_REFERER");
cgiEnv.httpUserAgent = cgiGetEnv("HTTP_USER_AGENT");
cgiEnv.pathInfo = cgiGetEnv("PATH_INFO");
cgiEnv.pathTranslated = cgiGetEnv("PATH_TRANSLATED");
cgiEnv.queryString = cgiGetEnv("QUERY_STRING");
cgiEnv.remoteAddr = cgiGetEnv("REMOTE_ADDR");
cgiEnv.remoteHost = cgiGetEnv("REMOTE_HOST");
cgiEnv.remoteIdent = cgiGetEnv("REMOTE_IDENT");
cgiEnv.remoteUser = cgiGetEnv("REMOTE_USER");
cgiEnv.requestMethod = cgiGetEnv("REQUEST_METHOD");
cgiEnv.scriptName = cgiGetEnv("SCRIPT_NAME");
cgiEnv.serverName = cgiGetEnv("SERVER_NAME");
cgiEnv.serverPort = cgiGetEnv("SERVER_PORT");
cgiEnv.serverProtocol = cgiGetEnv("SERVER_PROTOCOL");
cgiEnv.serverSoftware = cgiGetEnv("SERVER_SOFTWARE");
if (!strcmp(cgiEnv.requestMethod, "POST"))
cgiStdin = cgiGetStdin(cgiEnv.contentLength);
if (!strcmp(cgiEnv.requestMethod, "GET"))
cgiEnv.contentLength = strlen(cgiEnv.queryString);
}
if (!strcmp(cgiEnv.requestMethod, "GET"))
{
if (cgiArgc>1)
{
if (!cgiParseArgs(cgiArgv, cgiArgc))
{
cgiHeaderStatus(405, "Input Not Valid",
"Data sent to the CGI program was not valid");
return 0;
}
}
else
{
if (!cgiParseInput(cgiEnv.queryString, cgiEnv.contentLength))
{
cgiHeaderStatus(405, "Input Not Valid",
"Data sent to the CGI program was not valid");
return 1;
}
}
}
else
if (!strcmp(cgiEnv.requestMethod, "POST"))
{
if (!strcmp(cgiEnv.contentType, "application/x-www-form-urlencoded"))
{
if (!cgiParseInput(cgiStdin, cgiEnv.contentLength))
{
cgiHeaderStatus(405, "Input Not Valid",
"Data sent to the CGI program was not valid");
return 1;
}
}
else
{
cgiHeaderStatus(406, "Input Not Encoded",
"Data send to the CGI program was not URL encoded");
return 1;
}
}
else
{
cgiHeaderStatus(407, "Unknown Request Method",
"Only POST or GET request methods are available");
return 1;
}
if (cgiDebug && strstr(cgiDebug, "SAVE="))
{
if (cgiDebugEnvSave(strchr(cgiDebug, '=')+1))
{
cgiHeaderStatus(200, "Environment Capture Succeeded",
"CGI debug environment was saved to file");
cgiPrintf("<HR SIZE=10>");
}
else
{
cgiHeaderStatus(505, "Environment Capture Failed",
"CGI debug environment was not saved to file");
return 1;
}
}
cgiStatus = cgiMain();
if (!cgiHeaderFlag)
{
cgiHeaderStatus(504, "Document Header Unspecified",
"Document MIME type was not specified");
return 1;
}
return cgiStatus;
}
/* The End
******************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -