⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cgi.c

📁 计费部分源程序。我认为该软件极好
💻 C
📖 第 1 页 / 共 3 页
字号:
  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 + -