TINY Web Server源码阅读
最近利用闲暇时间在阅读《HTTP权威指南》,阅读到第5章提到了最小的Perl Web Server,就想到了如何实现一个简单的web server,谷歌后发现方式很多,比如nc -kl , python SimpleHttpServer, Jetty等,但是感觉最适合的还是CSAPP中11章涉及的tiny web server,之前阅读CSAPP到这里的时候只是粗略的理解,但是在深入理解HTTP结构后,画面就更清晰了。
之所以要学习这个tiny web server, CSAPP已经告诫我们了。
Tiny is an interesting program. It combines many of the ideas that we have learned about, such as process control, Unix I/O, the sockets interface, and HTTP, in only 250 lines of code. While it lacks the functionality, robustness, and security of a real server, it is powerful enough to serve both static and dynamic content to real Web browsers. We encourage you to study it and implement it yourself. It is quite exciting (even for the authors!) to point a real browser at your own server and watch it display a complicated Web page with text and graphics.
TINY的主程序main
1 | int main(int argc, char **argv) |
Open_clientfd 就是打开一个TCP套接字,设置SO_REUSEADDR选项;服务器采用循环处理模式。
处理HTTP请求doit
1 | /* |
错误处理 clienterror
1 | /* |
处理请求头部
1 | /* |
这里仅仅是打印出来。
解析URI
1 | /* |
解析uri是处理资源映射的问题,这里直接看uri中是否包含字符串cgi-bin。
处理静态请求
1 | /* |
先返回了响应头,然后采用内存映射读取文件,发送给client。
处理动态请求cgi
1 | /* |
在子进程中执行对应的cgi程序,参数的传递是通过环境变量,而且子进程继承了父进程描述符,所以可以操作连接套接字。