我正在实现一个仅用 C 语言处理 GET/POST/HEAD 的 Web 服务器。我想知道稳健解析传入 http 请求的一般策略是什么?
我应该逐个字符还是逐行进行操作?
逐个字符的方法似乎效率低下,因为我需要大量代码来跟踪状态,例如,当您看到“G”时,检查下一个是否是“E”,然后是“T”...
逐行方法似乎并不稳健。例如,客户端发送不完整的请求,例如缺少“\r\n”。另一个例子是请求可以采用不同的顺序
HTTP/1.1 GET/index.html
而不是GET/index.html HTTP/1.1
最佳答案
首先,HTTP/1.1 GET/index.html
格式错误 - 函数名称(例如 GET)必须放在第一位。正如 WTP 所建议的,在这种情况下我会返回“400 Bad Request”。
对于缺失的\r\n:想想如果这种情况合法发生你会怎么做;例如,如果客户端开始发送数据,但没有完成发送。
在这种情况下,通常的行为是等待用户完成发送 HTTP 请求,但保持超时,以便恶意或故障客户端不会导致您的服务器瘫痪。
如果请求未及时完成,则丢弃整个请求,并返回“408 Request Timeout”。
一旦解决了这个问题,你最好进行逐行解析。
关于http - 解析http请求 "line by line"还是 "char by char"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7462655/