工作线程的主要任务是处理客户端发起的HTTP请求。在代码中,http_conn
类封装了处理HTTP连接的逻辑,而工作线程通常会调用http_conn
类的process
方法来执行这一任务。以下是工作线程处理HTTP请求的逻辑梳理:
-
初始化连接:
- 当一个新的客户端连接被接受后,
http_conn
对象被创建并初始化,其中包含了客户端套接字的文件描述符和地址信息。 init
方法被调用,设置套接字为非阻塞模式,并将该套接字添加到epoll监控中,以便能够接收后续的读取事件。
- 当一个新的客户端连接被接受后,
-
读取请求:
read
方法被循环调用,从客户端套接字读取数据,直到没有更多数据可读或对方关闭连接。- 读取到的数据被存储在
http_conn
对象的缓冲区中。
-
解析请求:
process_read
方法负责解析HTTP请求。它首先通过parse_line
解析请求行(如GET /index.html HTTP/1.1),提取请求方法、URL和HTTP版本。- 然后,它通过
parse_headers
解析请求头,提取如Content-Length
、Host
等头部信息。 - 如果请求包含消息体(如POST请求),
parse_content
将被调用来解析消息体内容。
-
处理请求:
do_request
方法根据解析得到的URL和其他信息,确定请求的资源,并尝试在服务器上找到对应的文件。- 如果文件存在且可读,它将文件映射到内存中,并准备发送给客户端。
-
生成响应:
process_write
方法根据处理结果生成HTTP响应。这包括状态行(如200 OK)、响应头(如Content-Length
和Content-Type
)和响应体(如文件内容或错误信息)。- 如果请求成功,状态行将包含状态码200 OK,响应体将包含请求的资源内容。
- 如果发生错误(如404 Not Found),状态行将包含相应的错误状态码和错误信息。
-
发送响应:
write
方法负责将生成的HTTP响应发送给客户端。它使用writev
系统调用来发送多个内存块(如响应头和文件内容)。- 如果发送成功,根据HTTP请求中的
Connection
字段决定是否关闭连接。
-
清理和循环:
- 一旦响应发送完成,
http_conn
对象将被重置,准备接收下一个请求。 - 工作线程将继续从线程池中获取新的HTTP请求任务,并重复上述处理逻辑。
- 一旦响应发送完成,
整个过程中,http_conn
类封装了与单个HTTP连接相关的所有操作,包括读取请求、解析请求、处理请求、生成响应和发送响应。工作线程通过调用http_conn
类的方法来完成对每个客户端请求的处理。