有人可以告诉我Content-Length或Transfer-Encoding:“Chunked”是Http请求必须的吗?我正在使用c ++编写一个http服务器。
http响应可以使用close socket来了解消息体的长度。但请求怎么样?
我已经检查了关于http 1.1的RFC2616,但我对此并不清楚。
我的问题是,如果发出没有“Content-Length”或“Chunked Transfer-Encoding”的http请求,我怎么能用“WSARecv”来知道消息体的长度,对于我使用WSARecv并获取所有内容的情况标题和网络流以“\ r \ n \ r \ n”结尾,巧合的是,我无法获得邮件正文的长度。如果我再次提供WSARecv,它可能会永远等待,因为没有更多的数据。如果我没有再次提供“WSARecv”,我可能无法获得邮件正文,如果有的话。
或者也许“内容长度”和“分块传输编码”是http请求必须的?客户端应该设置其中一个来告诉服务器消息的长度吗?
答案 0 :(得分:1)
如果您没有指定Transfer-Encoding
或Content-Length
,则请求(或响应)隐式地是一个可变长度的请求/响应,并且发出正文结束信号的唯一方法是关闭连接(并反过来检测接收器中的关闭/ eof)。
这意味着此类请求/响应也隐含Connection: close
如果您正在实施HTTP1.1,则必须支持所有三种传输方法。
当我编写HTTP服务器时,我从“连接流”的概念中抽象出了“请求流”的概念。 “请求流”是多态的,支持读取到“EOF”的概念。没有理由你也没有“read_chunk”的方法。在非分块请求的情况下,这可以简单地读取直到EOF。
这允许我在同一个连接上同时执行多个请求(但是有一些jiggery-pokery可以确保响应以正确的顺序返回!)
答案 1 :(得分:0)
RFC 2616已过时。
答案在https://greenbytes.de/tech/webdav/rfc7230.html#header.content-length。