CONTENT-LENGTH:传递给CGI程序的数据字符数(字节数)。
在C语言程序中,要访向环境变量,可使用getenv()库函数。例如
:
name1=value1&name2=value2&name3=value3&name4=value4&...
其中名字是Form中定义的INPUT、SELECT或TEXTAREA等标置(Tag)名字,值是用户输入或选择的标置值。这种格式即为URL编码,程序中需要对其进行分析和解码。要分析这种数据流,CGI程序必须首先将数据流分解成一组组的名字/值对。这可以通过在输入流中查找下面的两个字符来完成。
每当找到字符=,标志着一个Form变量名字的结束;每当找到字符& ,标志着一个Form变量值的结束。请注意输入数据的最后一个变量的值不以&结束。一旦名字/值对分解后,还必须将输入中的一些特殊字符转换成相应的ASCII字符。这些特殊字符是:
+:将+转换成空格符;
%xx:用其十六进制ASCII码值表示的特殊字符。根据值xx将其转换成相应的ASCII字符。
对Form变量名和变量值都要进行这种转换。下面是一个对Form数据进行分析并将结果回送给Web服务器的CGI程序。
#include
#include
#include
int htoi(char *);
main()
{
int i,n;
char c;
printf (″Contenttype: text/plain
″);
n=0;
if (getenv(″CONTENT-LENGTH″))
n=atoi(getenv(″CONTENT-LENGTH″));
for (i=0; i
int is-eq=0;
c=getchar();
switch (c){
case ′&′:
c=′
′;
break;
case ′+′:
c=′ ′;
break;
case ′%′:{
char s[3];
s[0]=getchar();
s[1]=getchar();
s[2]=0;
c=htoi(s);
i+=2;
}
break;
case ′=′:
c=′:′;
is-eq=1;
break;
};
putchar(c);
if (is-eq) putchar(′ ′);
}
putchar (′
′);
fflush(stdout);
}
/* convert hex string to int */
int htoi(char *s)
{
char *digits=″0123456789ABCDEF″;
if (islower (s[0])) s[0]=toupper(s[0]);
if (islower (s[1])) s[1]=toupper(s[1]);
return 16 * (strchr(digits, s[0]) -strchr (digits,′0′)
)
+(strchr(digits,s[1])-strchr(digits,′0′));
}






