【版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途】
在上一节我们看到了第一个CGI程序,该程序仅仅是为了帮助理解CGI程序如何获取客户端提交的数据,只是输出环境变量没有做任何事,在实际应用中我们需要首先解析这些数据,然后提取其中我们需要的数据(如在登录时我们需要提取用户名和密码)。
用户名: <inputtype="text" name="用户名"/><br/> 密码: <inputtype="password" name="密码" /><br/><inputtype="radio" name="语言" value="English"/> English <br/>
<inputtype="radio" name="语言" value="Chinese"/> 简体中文 <inputtype="hidden" name="sessionid" value="1234567890"/><br/><inputtype="submit" value="登录"><br/>
/*该函数主要做解码工作*/
int sln_string_unescape(char **attr, const char *src, int len)
{
int pos = 0, src_pos = 0;
char escape_char;
char *p = NULL;
p = (char *)malloc(len + 1);
if (NULL == p) {
return -1;
}
while (src_pos < len) {
switch (src[src_pos]) {
case '%': /*表单属性中存放的数据中十六进制数“%HH“转换成相应的字符*/
escape_char = sln_hex2bin(src[src_pos+1]); /*sln_hex2bin() 函数负责将字符转换为其对应的ASCII码*/
escape_char <<= 4;
escape_char |= sln_hex2bin(src[src_pos+2]);
p[pos] = escape_char;
src_pos += 3;
break;
case '+': /*表单属性中有存放“+”的,则将其转换为空格*/
p[pos] = '\x20';
src_pos++;
break;
default:
p[pos] = src[src_pos];
src_pos++;
break;
}
pos++;
}
*attr = p;
return 0;
}
/*该函数解析传入的表单数据并输出解析结果*/
void sln_cgi_content_parse(char *input_content, int len)
{
char *start = NULL, *end = NULL;
char *attr = NULL, *value = NULL;
int attr_len, value_len;
start = (char *)input_content;
while ((end = strchr(start, '='))) {
*end = '\0';
attr_len = end - start;
sln_string_unescape(&attr, start, attr_len);
start = end + 1;
//if not find '&', then the last char is end
end = strchr(start, '&');
if (NULL != end) {
*end = '\0';
} else {
end = (char *)&input_content[len - 1];
}
value_len = end - start;
sln_string_unescape(&value, start, value_len);
start = end + 1;
if (end - input_content > len) {
break;
}
fprintf(stdout, "NAME: %s, VALUE: %s
\n", attr, value);
}
}
/*输出包含解析结果的页面*/
int main(int argc, const char *argv[])
{
......
fprintf(stdout, "\n");
fprintf(stdout, "\n");
fprintf(stdout, "CGI解析GET数据 \n");
fprintf(stdout, "\n");
fprintf(stdout, "\n");
fprintf(stdout, "以下为解析后数据
\n");
sln_cgi_content_parse(data, strlen(data));
fprintf(stdout, "本网页由CGI自动生成!\n");
fprintf(stdout, "");
fprintf(stdout, "");
......
}