我在我的LINUX机器上使用C语言的TCP套接字编程创建了一个非常简单的Web服务器。我从本地机器向浏览器(chrome和mozilla)发送HTTP GET请求。 这个问题是当我没有设置标题时 浏览器中的 Transfer-Encoding:chunked 成功显示网页。 但是当我保留这个标题时,浏览器没有响应,它说没有数据可用。
编辑:在我添加@RomanK指向的块大小(446字节)后,它现在适用于firefox。 但铬变得反应迟钝。
这是代码
responseIndex = add(response,"HTTP/1.1 200 OK",responseIndex);
responseIndex = add(response,"Transfer-Encoding: chunked",responseIndex);
responseIndex = add(response,"Content-Type: text/html",responseIndex);
response[responseIndex++]='\r';
response[responseIndex++]='\n';
updateIndex = add(response,"446",updateIndex);
responseIndex = add(response,filebuffer,responseIndex);
response[responseIndex++]='\0';
send(clntSock, response, strlen(response), 0) ;
close(clntSock);
exit(0);
此处,添加是一个函数,用于将第二个参数附加到响应,然后附加" / r / n"。
响应是一个字符串。
responseIndex 只是一个跟踪当前响应时长的int。
filebuffer 是一个字符串,其中包含要发送的html文件的所有文本。
回应:
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Content-Type: text/html
446 (or 1EB)
<html>
BODY
</html>
chrome给出的错误代码是:ERR_INVALID_CHUNKED_ENCODING
答案 0 :(得分:1)
Content-Length
和分块传输编码是互斥的。
您应该省略Content-Length
,而是根据Wikipedia article在每个块的开头添加块大小。
或者,换句话说,您需要在此行之前以十六进制输出块大小
responseIndex = add(response,filebuffer,responseIndex);
编辑:请注意,您只需要提供块的大小,而不是整个HTTP响应。在您的情况下,它应该只是HTML正文的大小;例如,看起来您的样本体的大小为十六进制或三十一(十六进制)(不确定空白)。
所以,3分: a)使用十六进制 b)使用小写字母 c)使用块的大小(在您的情况下,正文,因为您有一个块)。不要包含HTTP元数据的大小。
你首先使用块也有点疑问;只有在开始生成响应时您不知道响应大小的情况下才应使用它们。在这里,您可以知道开始时的响应大小,并且可以使用Content-Length
而不使用Transfer-Encoding: chunked
。
答案 1 :(得分:-1)
分块传输的重点是(抱歉同义反复)以块的形式发送数据。浏览器不知道预期有多少块,所以你需要告诉它一些块是最后一块。该协议指定最后一个块的大小应为0:
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Content-Type: text/html
446\r\n
Precisely 446 bytes of data
0\r\n