- ########
-
void serve_static(int fd, char *filename, int filesize)
-
{
-
#ifdef DEBUG
-
printf("serve static file: %s \n", filename);
-
#endif
-
int srcfd;
-
char *srcp, filetype[MAXLINE], buf[MAXLINE];
-
- ### 发送响应报头给客户端
### get_filetype 来得到 MIME 类型
-
get_filetype(filename, filetype);
##### 发送之前需要按照 HTTP 的规范发送 HTTP响应
##### 响应格式
的格式,以及相依之后跟随的响应报头和空行
-
sprintf(buf, "HTTP/1.0 200 OK\r\n");
-
sprintf(buf, "%sServer: Mini Web Server\r\n", buf);
-
sprintf(buf, "%sContent-length: %d\r\n", buf, filesize);
-
sprintf(buf, "%sContent-type: %s\r\n\r\n", buf, filetype);
-
write(fd, buf, strlen(buf));
-
-
- ### 发送响应主体内容(response body)全客户端
- ### 这里将所请求的文件发送给客户端就可以了,注意:这里没有加入复杂的错误处理逻辑,如果应用到实际项目中是
- ### 有必要加以改进的
-
srcfd = open(filename, O_RDONLY, 0);
-
srcp = mmap(0, filesize, PROT_READ, MAP_PRIVATE, srcfd, 0);
-
close(srcfd);
-
write(fd, srcp, filesize);
-
munmap(srcp, filesize);
-
}
- #### 从文件类型得到对应的 MIME类型
- void get_filetype(char *filename, char *filetype)
-
{
-
if (strstr(filename, ".html"))
-
strcpy(filetype, "text/html");
-
else if (strstr(filename, ".gif"))
-
strcpy(filetype, "image/gif");
-
else if (strstr(filename, ".jpg"))
-
strcpy(filetype, "image/jpeg");
-
else
-
strcpy(filetype, "text/plain");
-
}
MIME (Multipurpose Internet Mail Extensions,多用途的网际右键扩展协议)是创建用于电子邮件交换,网络文档,及企业网和 Internet上的其他应用程序中的文件格式的规范。我们在WEB服务器中也是用这种规范。 MIME 格式包含一个 MIME 内容类型 ( "MIME type")和指示存储在这个文件中的数据的子类型,一般以类型/子类型的形式列出。
MINIWEBSERVER 仅用来支持 HTML,GIF,JPG以及纯文本类型,因此 ge_filetype 的实现非常简单,仅仅根据文件扩展名返回对应的 MIME 类型即可。