http - 解析http请求 "line by line"还是 "char by char"?

标签 http httprequest

我正在实现一个仅用 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/

相关文章:

javascript - 如何创建一个链接,以便单击它会触发 GET 但不打开窗口

json - Spring-Integration:使用 json 的 int-http:outbound-channel-adapter

http - 如何使用 Reddit 的 API 登录?

php - 在 Android 中发出 HTTP 请求的最标准/常见方法

rest - Dart:我无法使用HttpRequest.send()方法在HTTP消息主体中发布数据

node.js - Nodejs twitter api 不返回预期的 token

json - 从有 Angular 的 ui-modal 发出发布请求

http - 谷歌应用程序脚本 : testing doPost() with cURL

node.js - 如何使用 Node Fetch 将来自 HTTP 请求的数据保存在变量中?

http - 如何在nginx的请求和响应中将时间戳设置为 header ?