2.1 履行流程

tiny httpd源码分析:2.执行流程及主要函数浅析
上图展现了tiny httpd大致的履行流程:

①main()函数首先调用了startup()函数敞开了一个TCP服务器端口。

②该端口在收到恳求后,main()函数会创立一个线程,履行accept_request()函数处理恳求

③accept_request()函数会首先解析恳求行,假如该恳求是一个非GET、POST恳求,那么向客户端回来一个501(Not Implemented)呼应。

④假如该恳求是GET或POST恳求,那么accept_request()函数会持续履行。假如恳求的文件不存在,将回来一个404(Not Found)呼应。

⑤假如恳求的文件存在,服务器会判别其是HTML静态文件仍是CGI程序。假如是HTML静态文件,则直接回来它。假如是CGI程序,则先解析恳求头,假如解析失败,回来400(Bad Request)呼应;解析成功,则履行CGI程序,回来程序履行成果。

2.2 首要函数浅析

在详细地剖析每个函数之前,咱们先来大致地了解一下他们的作用。

2.2.1 startup()

startup()敞开了一个TCP服务器。总所周知,HTTP协议是依据TCP协议的。这儿有一个重要的网络编程概念 —— socket,后边咱们将花费很多篇幅去解说它,它是整个网络编程的根底。

2.2.2 accept_request()

accept_request()担任处理HTTP恳求,是整个服务器的中心。tiny httpd每收到一个恳求,就会创立一个线程履行accept_request()函数。后边的几个首要功能函数都是在accept_request()中被调用的。

2.2.3 unimplemented()

HTTP协议是一个相当宽松的协议,其规范只需求咱们实现GET和HEAD办法,其他的办法都是可选的。所以当服务器收到一个自己没有实现的办法时,HTTP协议规则服务器回来一个501(Not Implemented)呼应,来告诉客户端当前服务器不支撑该办法。tiny httpd是J.David Blackstone在1999年出于学习目的完结的,所以它支撑GET和POST办法。当客户端恳求的办法是非GET、POST办法时,tiny httpd就会调用unimplemented()回来一个501呼应。

2.2.4 not_found()

Not Found是咱们阅读网页时最常见的过错,它表明服务器找不到咱们所恳求的资源。当然,HTTP协议并未强制规则只能在此种情况下运用Not Found呼应,所以当服务器不想回来某个资源给客户端,同时又不想给出详细理由时,也可以回来一个404呼应“敷衍”客户端。tiny httpd中的not_found()函数就是用来回来404呼应的。

2.2.5 serve_file()

serve_file()担任将服务器上的静态资源回来给客户端。常见的静态资源有HTML文档、CSS文件等。

2.2.6 execute_cgi()

当客户端恳求的是一个CGI程序时,tiny httpd就会调用execute_cgi()。这儿咱们将接触到另一个很重要的概念 —— CGI,其全称是Common Gateway Interface(通用网关接口)。实际上,现在CGI已根本被淘汰,之所以说它重要,是因为现在的WSGI和Servlet等协议的规划思维都源自于CGI。CGI的首要作用是依据恳求的上下文,动态地生成呼应。其详细内容咱们将在后续的博客中探求。

2.2.7 bad_request()

HTTP协议对恳求的格局有必定的要求,假如服务器收到了一个格局过错的恳求,HTTP协议规则服务器回来一个400(Bad Request)呼应。bad_request()在tiny httpd中就扮演了这一人物。

2.3 总结

熟悉HTTP协议和web开发的同学应该知道我在说什么,不熟悉的同学或许已经是这个状态了:

tiny httpd源码分析:2.执行流程及主要函数浅析
请不要着急,今天只是简单地过一下tiny httpd处理HTTP恳求的过程,对HTTP协议和网络编程的根本概念树立一个初步的形象。万里长征才开始第一步!