c++ - "Content-Length"或 "chunked transfer-encoding"是Http请求必须的吗?

标签 c++ http

有人可以告诉我有关 Content-Length 或 Transfer-Encoding 的信息:“Chunked”是 Http 请求的必须条件吗?我正在使用 C++ 编写一个 http 服务器。

http响应可以使用close socket来知道消息体的长度。但是请求呢?

我查过 RFC2616 关于 http 1.1 的内容,但我对此还不够清楚。

我的问题是,如果发送的http请求没有“Content-Length”或“Chunked Transfer-Encoding”,我如何使用“WSARecv”来知道消息正文的长度,对于我使用WSARecv并获取所有内容的情况标题和网络流恰好以“\r\n\r\n”结尾,我无法获取消息正文的长度。如果我再次发送 WSARecv,它可能会永远等待,因为没有更多数据。如果我不再发送“WSARecv”,如果有的话,我可能无法收到消息正文。

或者“内容长度”和“分块传输编码”可能是http请求所必需的?客户端应该设置其中之一来告诉服务器消息的长度?

最佳答案

如果您未指定 Transfer-EncodingContent-Length,则请求(或响应)隐式是可变长度请求/响应,并且是唯一的方法发出主体结束信号就是关闭连接(并相反地检测接收器中的关闭/eof)。

这意味着这种请求/响应也是隐式Connection: close

如果您要实现 HTTP1.1,那么您必须支持所有三种传输方法。

当我编写 HTTP 服务器时,我从“连接流”的概念中抽象出了“请求流”的概念。 “请求流”是多态的,并且支持读取“EOF”的概念。没有理由你不能有一个方法来“read_chunk”。在非分块请求的情况下,可以简单地读取直到 EOF。

这使我能够在同一连接上同时执行多个请求(但有一些棘手的问题来确保响应以正确的顺序返回!)

关于c++ - "Content-Length"或 "chunked transfer-encoding"是Http请求必须的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59604725/

相关文章:

c++ - boost::spirit::karma 替代生成器,带有由字符串和字符串别名组成的 boost::variant

java - 如何将自定义 header 变量添加到请求并重定向用户

java - 使用 POST 请求将值从 HTTP 客户端发送到 HTTP 服务器,用 Java 编码

java - HttpURLConnection 将响应返回为 FileNotFoundException (404) 而不是 401

c++ - 正确的结构内存管理

c++ - 返回对 DLL 中对象的引用

c# - WPF C# 应用程序中的 C++ Dll

c++ - 在初始化期间将未初始化的字符串分配给自身

ios - 如何避免 iOS Newsstand 应用程序收到远程通知而导致 Web 服务器流量高峰?

http - 更正用于登录 API 的 http 动词