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 通常不是语法问题,而是边界字符处理不严谨。