📄 cgi.c
字号:
int cgiHeaderLocation(char *redirectUrl)
{
if (cgiHeaderFlag++)
return 0;
printf("Location: %s\n\n", redirectUrl);
return 1;
}
/******************************************************************************
**
** Function cgiHeaderStatus
**
** Purpose Return an error status
**
** History Date Author Modification
** 04-03-96 JEM First Draft
**
******************************************************************************/
int cgiHeaderStatus(int statusCode, char *statusReason, char *statusMesg)
{
if (cgiHeaderFlag++)
return 0;
printf("Content-type: text/html\n");
printf("Status: %i %s\n\n", statusCode, statusReason);
cgiPrintf("<HTML>");
cgiPrintf("<HEAD>");
cgiPrintf("<TITLE>%i %s</TITLE>", statusCode, statusReason);
cgiPrintf("</HEAD>");
cgiPrintf("<BODY>");
cgiPrintf("<H2>%i %s</H2>", statusCode, statusReason);
cgiPrintf("<H3>%s</H3>", statusMesg);
cgiPrintf("</BODY>");
cgiPrintf("</HTML>");
return 1;
}
/******************************************************************************
**
** Function cgiHeaderNonParse
**
** Purpose Indicate that the document is to be sent directly to the client
** with minimal buffering.
**
** History Date Author Modification
** 07-03-96 JEM First Draft
**
******************************************************************************/
int cgiHeaderNonParse(int statusCode, char *statusMesg, char *mimeType)
{
if (cgiHeaderFlag++)
return 0;
printf("%s %i %s\n",
*cgiEnv.serverProtocol?cgiEnv.serverProtocol:"unknown",
statusCode, statusMesg);
printf("Server: %s\n",
*cgiEnv.serverSoftware?cgiEnv.serverSoftware:"unknown");
printf("Content-type: %s\n\n", mimeType);
return 1;
}
/******************************************************************************
**
** Function cgiHtmlHead
**
** Purpose Essentially a wrapper for the initialisation of a HTML document
**
** History Date Author Modification
** 29-03-96 JEM First Draft
**
******************************************************************************/
int cgiHtmlHead(char *title)
{
if (!cgiHeaderFlag)
return 0;
if (cgiHtmlFlag++)
return 0;
cgiPrintf("<HTML>");
cgiPrintf("<HEAD>");
cgiPrintf("<TITLE>%s</TITLE>", title);
cgiPrintf("</HEAD>");
cgiPrintf("<BODY>");
return 1;
}
/******************************************************************************
**
** Function cgiHtmlTail
**
** Purpose Finalises a HTML document
**
** History Date Author Modification
** 29-03-96 JEM First Draft
**
******************************************************************************/
int cgiHtmlTail()
{
if (!cgiHeaderFlag)
return 0;
if (!cgiHtmlFlag)
return 0;
cgiPrintf("</BODY>");
cgiPrintf("</HTML>");
return 1;
}
/******************************************************************************
**
** Function cgiImageOk
**
** Purpose Determines the browser's ability to view images
**
** History Date Author Modification
** 29-03-96 JEM First Draft
**
******************************************************************************/
int cgiImageOk()
{
return (!strstr(cgiEnv.httpAccept, "image"));
}
/******************************************************************************
**
** Function cgiLoad
**
** Purpose Copy an external file into the current document
**
** History Date Author Modification
** 01-04-96 JEM First Draft
**
******************************************************************************/
int cgiLoad(char *file)
{
FILE *fp;
int c;
if (!(fp = fopen(file, "r")))
return 0;
while ((c=getc(fp)) != EOF)
putchar(c);
fflush(stdout);
fclose(fp);
return 1;
}
/******************************************************************************
**
** Function cgiPrintf
**
** Purpose Same as printf, but suffixes a NL char to help keep script tidy,
** and flushes output.
**
** History Date Author Modification
** 04-03-96 JEM First Draft
**
******************************************************************************/
int cgiPrintf(char *fmt, ...)
{
va_list argp;
if (!cgiHeaderFlag)
return 0;
va_start(argp, (void)fmt);
vfprintf(stdout, fmt, argp);
va_end(argp);
fprintf(stdout, "\n");
fflush(stdout);
return 1;
}
/******************************************************************************
** Local functions
******************************************************************************/
/******************************************************************************
**
** Function cgiStrdup
**
** Purpose Equivalent to non_ANSI C function strdup().
**
** History Date Author Modification
** 11-02-97 JEM First Draft
**
******************************************************************************/
static char *cgiStrdup(char *s)
{
char *m;
if (!s)
return NULL;
if (!(m = (char*)malloc(strlen(s)+1)))
return NULL;
return strcpy(m, s);
}
/******************************************************************************
**
** Function cgiDebugGetStr
**
** Purpose Used by cgiDebugEnvLoad to get an environment string
**
** History Date Author Modification
** 29-03-96 JEM First Draft
** 16-04-96 JEM Return empty string, not NULL, on malloc fail
**
******************************************************************************/
static char *cgiDebugGetStr(FILE *fp)
{
char *s;
long la, lb;
la = ftell(fp);
while (getc(fp)!='\n')
;
lb = ftell(fp);
if (!(s = (char*)malloc(lb-la)))
return "";
fseek(fp, la, 0);
fgets(s, (lb-la), fp);
fseek(fp, lb, 0);
return s;
}
/******************************************************************************
**
** Function cgiDebugGetInt
**
** Purpose Used by cgiDebugEnvLoad to get an environment integer
**
** History Date Author Modification
** 29-03-96 JEM First Draft
**
******************************************************************************/
static int cgiDebugGetInt(FILE *fp)
{
char *s = cgiDebugGetStr(fp);
int i = atoi(s);
free(s);
return i;
}
/******************************************************************************
**
** Function cgiDebugEnvLoad
**
** Purpose Load a debug environment
**
** History Date Author Modification
** 29-03-96 JEM First Draft
**
******************************************************************************/
static int cgiDebugEnvLoad(char *file)
{
FILE *fp;
int cnt;
if (!(fp = fopen(file, "rb")))
return 0;
/* --- command-line arguments --- */
cgiArgc = cgiDebugGetInt(fp);
if (!(cgiArgv = (char**)malloc(cgiArgc*sizeof(char*))))
return 0;
for (cnt=0; cnt<cgiArgc; cnt++)
cgiArgv[cnt] = cgiDebugGetStr(fp);
/* --- standard input --- */
cgiStdin = cgiDebugGetStr(fp);
/* --- CGI environment variables --- */
cgiEnv.authType = cgiDebugGetStr(fp);
cgiEnv.contentLength = cgiDebugGetInt(fp);
cgiEnv.contentType = cgiDebugGetStr(fp);
cgiEnv.gatewayInterface = cgiDebugGetStr(fp);
cgiEnv.httpAccept = cgiDebugGetStr(fp);
cgiEnv.httpHost = cgiDebugGetStr(fp);
cgiEnv.httpReferer = cgiDebugGetStr(fp);
cgiEnv.httpUserAgent = cgiDebugGetStr(fp);
cgiEnv.pathInfo = cgiDebugGetStr(fp);
cgiEnv.pathTranslated = cgiDebugGetStr(fp);
cgiEnv.queryString = cgiDebugGetStr(fp);
cgiEnv.remoteAddr = cgiDebugGetStr(fp);
cgiEnv.remoteHost = cgiDebugGetStr(fp);
cgiEnv.remoteIdent = cgiDebugGetStr(fp);
cgiEnv.remoteUser = cgiDebugGetStr(fp);
cgiEnv.requestMethod = cgiDebugGetStr(fp);
cgiEnv.scriptName = cgiDebugGetStr(fp);
cgiEnv.serverName = cgiDebugGetStr(fp);
cgiEnv.serverPort = cgiDebugGetStr(fp);
cgiEnv.serverProtocol = cgiDebugGetStr(fp);
cgiEnv.serverSoftware = cgiDebugGetStr(fp);
fclose(fp);
return 1;
}
/******************************************************************************
**
** Function cgiDebugEnvSave
**
** Purpose Save a debug environment
**
** History Date Author Modification
** 29-03-96 JEM First Draft
**
******************************************************************************/
static int cgiDebugEnvSave(char *file)
{
FILE *fp;
int cnt;
if (!(fp = fopen(file, "wb")))
return 0;
/* --- command-line arguments --- */
fprintf(fp, "%i\n", cgiArgc);
for (cnt=0; cnt<cgiArgc; cnt++)
fprintf(fp, "%s\n", cgiArgv[cnt]);
/* --- standard input --- */
fprintf(fp, "%s\n", cgiStdin);
/* --- CGI environment variables --- */
fprintf(fp, "%s\n", cgiEnv.authType);
fprintf(fp, "%i\n", cgiEnv.contentLength);
fprintf(fp, "%s\n", cgiEnv.contentType);
fprintf(fp, "%s\n", cgiEnv.gatewayInterface);
fprintf(fp, "%s\n", cgiEnv.httpAccept);
fprintf(fp, "%s\n", cgiEnv.httpHost);
fprintf(fp, "%s\n", cgiEnv.httpReferer);
fprintf(fp, "%s\n", cgiEnv.httpUserAgent);
fprintf(fp, "%s\n", cgiEnv.pathInfo);
fprintf(fp, "%s\n", cgiEnv.pathTranslated);
fprintf(fp, "%s\n", cgiEnv.queryString);
fprintf(fp, "%s\n", cgiEnv.remoteAddr);
fprintf(fp, "%s\n", cgiEnv.remoteHost);
fprintf(fp, "%s\n", cgiEnv.remoteIdent);
fprintf(fp, "%s\n", cgiEnv.remoteUser);
fprintf(fp, "%s\n", cgiEnv.requestMethod);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -