- ######################
- ### 将出粗信息返回给客户端浏览器
- void error_msg(int fd, char *cause, char *errnum,
-
char *shortmsg, char *longmsg)
-
{
-
char buf[MAXLINE], body[MAXLINE];
########################
### 组合HTML格式HTTP响应
### sprintf函数:格式换字符输入
-
sprintf(body, "Error");
-
sprintf(body, "%s"ffffff"">\r\n", body);
-
sprintf(body, "%s%s: %s\r\n", body, errnum, shortmsg);
-
sprintf(body, "%s
%s: %s\r\n"
, body, longmsg, cause);
-
sprintf(body, "%s
Mini Web server\r\n", body);
### 将HTTP响应写入fd(忽略了出错处理)
-
@ sprintf(buf, "HTTP/1.0 %s %s\r\n", errnum, shortmsg);
-
write(fd, buf, strlen(buf));
-
sprintf(buf, "Content-type: text/html\r\n");
-
write(fd, buf, strlen(buf));
-
sprintf(buf, "Content-length: %d\r\n\r\n", (int)strlen(body));
-
write(fd, buf, strlen(buf));
-
write(fd, body, strlen(body));
-
}
我们需要按照HTTP响应的规范来给浏览器端发送错误信息,响应行的格式为“
”, 这体现在 @ 这一行,接下去还发送了“content-type”和“content-length”信息,以及标志HTTP响应结束的空行。
- ##############
- ### 解析 URI 并保存参数filename 和 CGI args 如果是CGI请求,返回1,否则如果是静态请求,则返回0
- int parse_uri(char *uri, char *filename, char *cgiargs)
-
{
-
char *ptr;
### 通过 uri 有无 “gi-bin”来判断所要求的是静态还是动态的内容。如果是静态内容,cigiargs设为空串,将
### uri 补充为完整路径(以当前目录为前缀),且将默认的网页设置为 “index.html”
-
if (!strstr(uri, "cgi-bin")) { /* Static content */
-
strcpy(cgiargs, "");
-
strcpy(filename, "."); /*serve the current directory*/
-
strcat(filename, uri);
-
if (uri[strlen(uri)-1] == '/')
-
strcat(filename, "index.html");
-
return 0;
-
}
### 如果是动态内容,则解析cgiargs。按照 CGI 的规范,参数和 URI通过问号 “?”来隔开,且在参数之间用符号“&”进
### 分隔,按照这种规范 解析 CGI 的参数串,存入cgiargs 中。
-
else { /* CGI request */
-
ptr = index(uri, '?');
-
if (ptr) {
-
strcpy(cgiargs, ptr+1);
-
*ptr = '\0';
-
}
-
else
-
strcpy(cgiargs, "");
-
-
strcpy(filename, ".");
-
strcat(filename, uri);
-
return 1;
-
}
-
}
### parse_uri 函数返回值来表示所请求的是静态网页还是CGI程序
0:表示请求静态网页,
1:表示CGI程序