您的位置:首页 > 理论基础 > 计算机网络

HTTP服务器的本质

2018-03-22 08:40 169 查看
 已经有一个月没有更新博客了,一方面是因为平时太忙了,另一方面是想积攒一些干货进行分享。最近主要是做了一些开源项目的源码分析工作,有c项目也有python项目,想提升一下内功,今天分享一下tinyhttpd源码分析的成果。tinyhttpd是一个非常轻量型的http服务器,c代码500行左右,可以帮助我们了解http服务器运行的实质。在分析之前,我们先说一下http报文。(我的新书《Python爬虫开发与项目实战》出版了,大家可以看一下样章)一.http请求http请求由三部分组成,分别是:起始行、消息报头、请求正文
1、起始行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:
其中 Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。2、请求方法(所有方法全为大写)有多种,各个方法的解释如下:GET 请求获取Request-URI所标识的资源POST 在Request-URI所标识的资源后附加新的数据HEAD 请求获取由Request-URI所标识的资源的响应消息报头PUT 请求服务器存储一个资源,并用Request-URI作为其标识DELETE 请求服务器删除Request-URI所标识的资源TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断CONNECT 保留将来使用OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求应用举例: GET方法:在浏览器的地址栏中输入网址的方式访问网页时,浏览器采用GET方法向服务器获取资源,eg: 
POST方法要求被请求服务器接受附在请求后面的数据,常用于提交表单。eg:
 二.tinyhttpd源码分析  tinyhttpd总共包含以下函数:
建议源码阅读顺序: main -> startup -> accept_request -> execute_cgi 按照以上顺序,看一下浏览器和tinyhttpd交互的整个流程:三.注释版源码  注释版源码已经放到github上了,以后所有的源码分析都会上传github上。由于tinyhttpd源码较少,下面将完整的代码贴出来。
  不过这个项目并不能直接在Linux上编译运行。它本来是在solaris上实现的,貌似在socket和pthread的实现上和一般的Linux还是不一样的,需要修改一部分内容。至于如何修改大家参考这篇文章,我也将修改版上传到github上了,名称为tinyhttpd-0.1.0_for_linux,大家可以clone下来,直接make编译即可。下面演示一下如何运行tinyhttpd,编译完成的效果如下:下面运行./httpd,并在浏览器中访问。tinyhttpd默认cgi脚本是perl脚本,比如color.cgi,位于htdocs目录下。
 下面我想用python来实现cgi脚本,添加一些页面,为了更加了解cgi程序的运行实质,不用python封装好的cgi模块,完全手工打造。首先在htdocs目录下添加一个register.html页面,html文档内容如下:
  这是一个表单,action指向register.cgi,method为post。下面看一下register.cgi,其实是个python脚本。
  代码的意思是从标准输入中读取post中的数据,并将显示数据输出到标准输出中,对比一下流程图,更好理解。下面看一下运行效果。 今天的分享就到这里,下一篇继续分析。如果大家觉得还可以呀,记得推荐呦。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  tinyhttpd