基于CGI实现简易HTTP服务器(HTTP/1.0版本)
- HTTP协议是基于TCP协议的通信协议,因此,实现服务器的第一步是至少实现两个主机不同进程间TCP通信
- 当服务器收到请求后,首先分析请求方法(method 为POST || GET方法)
- 当方法确定后,获取请求的URL,这一步是为了后边处理GET方法和POST方法(CET方法和POST方法参数位置不同,GET参数在URL中用指针指示标识,POST方法在请求正文中用正文长度content_length标识)
- 判断资源是否存在,如果存在,判断这个资源是一个目录,普通文件,还是一个可执行程序。
GET方法:如果没有参数,就直接将请求的资源以html各式返回给客户端;否则进入excute_cgi运行CGI程序的处理
POST方法:进入excute_cgi运行CGI程序处理; 因为只要是POST方法就支持CGI,否则出错返回500 - 返回各自情况对应的报文
- 关闭与客户端的连接就是完成了一次HTTP请求与回应,因为HTTTP是无连接的
(橙色标注线条为概括性的总流程)
运行excute_cgi时首先从客户端发来的报文读取参数。
建立两个管道cgi_input和cgi_output,然后根据需要fork出一个子进程通过管道进行CGI部分的处理
父进程通过环境变量的形式将参数转交给子进程,子进程运行完成后,将结果交给父进程,父进程再将数据输送给客户端。
具体内部:
父进程:
- 创建两个管道,并关闭相应的文件描述符
- POST方法:继续读取数据,直到读完POST参数部分
- GET方法:直接从子进程读取结果
- 将数据和方法全部交给子进程后等待子进程的结果(方法决定读取顺序)
子进程:
- 关闭管道的适当文件描述符
- 对标准输入输出进行重定向
- 通过环境变量传递参数
- 进行execl程序替换