本项目主要实现一个HTTP服务器的框架结构,为了了解HTTP服务器的工作流程,下面实现一个多线程版本的HTTP服务器框架,采用CGI协议来进行程序替换完成主要业务,主要支持GET和POST方法。
关于HTTP协议:
https://blog.csdn.net/hansionz/article/details/86137260
关于CGI协议:
如果使用非CGI
协议处理浏览器的请求的话很简单,服务器直接将浏览器请求的资源返回即可。但是使用CGI协议方式为浏览器服务的框架原理如下:
HTTP服务器的工作原理:
- 搭建的是一个多线程服务器,并且使用短连接。
- 所以每当建立一个连接之后,就创建一个线程去处理这个请求,并将这个线程设置成分离状态,然后主线程继续处于监听状态。
- 当线程处理完这个请求之后,然后断开连接。
- 实现支持GET和POST方法的小型http服务器。
GET方法:如果GET方法只是简单的请求一份资源,而不传递参数的话则由服务器直接将资源返回即可。如果GET方法的URL中带有参数的话,则就要使用CGI程序进行响应计算。
POST方法:POST方法要使用CGI程序进行处理。POST的参数在消息正文中出现。
- 由于请求方法在http请求报文中的第一行,所以我们需要按行读取第一行,然后判断是那种方法,然后判断是不是CGI程序。
- 当我们判断出是GET请求时,并且url中没有参数的时候,就是用非CGI模式。非CGI模式处理起来比较简单,首先我们要解析出请求路径,然后判断请求的是不是合法资源,如果是的话,我们就直接返回这个资源即可。
- 当是CGI模式处理请求的时候,我们要要将
fork
一个子进程,对子进程exec
替换CGI程序。在这过程中,我们使用pipe
进行父子进程之间的通信。可以将参数设置为环境变量,然后CGI程序可以根据环境变量获得参数,从而构造响应结果。
HTTP服务器的主要流程:
项目源码: