Back to VNotes

C++ WebServer / 07

HTTP 状态机:如何解析请求行和请求头

v4.0 实现 HTTP 请求解析和默认首页。状态机保存解析进度,让服务器能处理分片到达的 HTTP 报文。

这一阶段要解决什么问题

HTTP 请求不是一次 read 就一定完整。解析器必须知道当前处于请求行、请求头还是请求体阶段,并且在数据不足时暂停。

原来的实现有什么缺陷

简单字符串查找只适合完整报文。如果请求行或请求头被拆成多次到达,解析逻辑就会混乱。

我是怎么改的

Connection 中保存 check_state,通过 parse_line 找 CRLF,再根据状态调用 parse_request_line、parse_headers、parse_body。解析结果用 HttpCode 表示下一步是继续读、生成响应还是关闭连接。

核心代码 / 关键逻辑

CHECK_REQUEST_LINE
  -> parse method / url / version
CHECK_HEADERS
  -> parse Host / Connection / Content-Length
CHECK_BODY
  -> wait body complete
REQUEST_COMPLETE
  -> do_request()

踩坑记录

Header value 的结尾定位很容易出错。提交记录里多次修复了 header value end 的查找方式,这类 bug 通常不是语法问题,而是边界字符处理不严谨。