Tinyhttpd项目解析

Tinyhttpd项目解析

TinyHTTPd是一个开源的轻量级HTTP服务器,整个代码500多行,10多个函数,对于学习HTTP服务器的原理来说非常有帮助,把代码读一遍,再按照执行处理流程调试一下,基本上可以搞清楚Web服务器在收到静态页面请求和CGI请求的一些基本处理逻辑。

Tinyhttp运作流程图:
Tinyhttpd项目解析_第1张图片

Socket编程->linux下用C语言开发多线程程序
Tinyhttpd项目解析_第2张图片
以上是基于TCP连接的C/S模型,由于本项目是http服务器,即B/S模型,因此不需要客户端程序,服务器端负责接收浏览器的http请求并处理,有可能返回静态页面,也有可能返回cgi脚本运行结果。

管道通信
Tinyhttpd项目解析_第3张图片
(1)子进程负责运行cgi脚本;
(2)父进程负责从浏览器接收数据,并通过管道发送给cgi脚本处理;通过管道得到cgi脚本结果,并发送给浏览器。

HTTP协议详解:

https://blog.csdn.net/wenqiang1208/article/details/74852433

Tinyhttpd项目解析_第4张图片

HTTP协议报文处理:

(1)HTTP请求报文request格式:
Tinyhttpd项目解析_第5张图片
(2)GET和POST区别:
Tinyhttpd项目解析_第6张图片
(3)HTTP回复报文response格式:
Tinyhttpd项目解析_第7张图片
(4)程序部分解读
对请求头进行处理,得到method、url
若为post,则调用cgi程序;
若为get,则需要判断是否带参数,若带参数,调用cgj程序;不带参数,则根据url获取path,并判断path是否存在,决定返回错误还是静态页面。

请求报文发送过来,需要getline()一行行读取以及recv()函数一字字读取;
而发送报文,需要通过send()函数一行行发送,包括状态行、响应正文等。

Cgi程序详解:
(1)程序解读:
Get:通过设置query_string环境变量,调用cgi;
Post:通过设置content_length环境变量以及获取请求报文主体数据,调用cgi;

(2)Cgi程序理解:
Cgi程序放置在服务器上的一段可执行程序。作为HTTP服务器的时候,客户端可以通过GET或者POST请求来调用这可执行程序。

任何的HTML均是静态网页,它无法实现一些复杂的功能,而CGI可以为我们实现。CGI全称是 Common Gate Intergace ,在物理上,CGI是一段程序,它运行在Server上,提供同客户端 Html页面的接口。

(3)如何调用cgi:

  1. GET:当使用这种方法时,CGI程序从环境变量QUERY_STRING获取数据。QUERY_STRING 被称为环境变量,就是这种环境变量把客户端的数据传给服务器。为了解释和执行程序,CGI必须要分析(处理)此字符串。
  2. POST:使用POST方法时,WEB服务器通过stdin(标准输入),向CGI程序传送数据。服务器在数据的最后没有使用EOF字符标记,因此程序为了正确的读取stdin,必须使用CONTENT_LENGTH。

HTML程序解读:
Tinyhttpd项目解析_第8张图片
这是静态页面程序,当浏览器端输入服务器地址后,通过get方法发送给服务器,浏览器便可得到此程序,显示界面如下:
Tinyhttpd项目解析_第9张图片
而圈出来的程序表示:带有一个输入字段和一个提交按钮,输入字段得到的参数赋值给参数color,而点击按钮,则将参数通过post方法发送给服务器端的color.cgi程序并运行。

Color.cgi程序解读:
Tinyhttpd项目解析_第10张图片
Post方法是将color数据放在发送报文的主体中,因此需要通过recv()函数获取,并通过write()函数管道通信给cgi程序中;而后cgi将上述的html程序通过管道通信给父进程,再通过send()函数形成发送报文的正文部分发送给浏览器。

Html中title设置页面标题,bgcolor设置背景颜色,h1设置正文标题,界面如下:
Tinyhttpd项目解析_第11张图片

项目源码参考:

https://blog.csdn.net/qq_38537503/article/details/90550739?biz_id=102&utm_term=TinyHttpd&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-3-90550739&spm=1018.2118.3001.4187

github参考:

https://github.com/WenQiangW/TinyHttpd/blob/master/htdocs/check.cgi

你可能感兴趣的:(Tinyhttpd项目解析)