谷歌浏览器在访问网站时发送第二个 0 长度的请求?



我正在开发一个运行在Nintendo Switch上的小型轻量级HTTP服务器,因此在类UNIX系统(freeBSD内核(上运行。我使用原始socket()bind()listen()等方法构建了一个没有任何库的HTTP服务器。

我注意到,当我使用 Google Chrome 打开服务器的地址时,它首先发送一个包含所有标头的标准 HTTP GET 请求,然后发送第二个 0 字节长的请求(可能甚至不是请求,它只是打开与服务器的第二个连接,然后什么也不发送(。

由于我的实现,这不容易处理,因为我使用recv()从连接接收所有数据,它会阻塞直到读取所有数据。因此,在 Chrome 发送的第二个请求中,它将"永久"阻止(有超时(,因为 Chrome 不发送任何数据。

这是Chrome的已知错误吗,我有什么方法可以检测和/或防止这种情况发生吗?我用Firefox和Edge测试了它,这些浏览器没有打开第二个套接字。

谢谢!

解决方案比我想象的要容易。您可以忽略第二个套接字,MSG_DONTWAIT并将其作为标志传递给recv()调用。更多关于这一点的信息 这里.

此外,我的问题是我向所有没有 URL 的请求返回 HTTP 501 响应。对于第二个 0 长度的套接字,这显然破坏了它并使 Chrome 显示错误。我添加了处理,当有 0 长度的请求时不会返回错误。它只会默默地关闭它。

最新更新