繁体   English   中英

传输编码:分块—浏览器不响应

[英]Transfer-Encoding: chunked— Browser does not respond

我已经使用C语言的TCP套接字编程在LINUX机器上制作了一个非常简单的Web服务器。我正在从本地机器的浏览器(chrome和mozilla)向其发送HTTP GET请求。 问题是当我不设置标题时
Transfer-Encoding:在响应中分块显示,浏览器成功显示了该网页。 但是当我保留此标头时,浏览器不响应,它说没有可用数据

编辑:在我添加了@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);

在这里, add是将第二个参数附加到响应,然后附加“ / r / n”的函数。

响应是一个字符串。

responseIndex只是一个可以跟踪当前响应长度的整数。

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

Content-Length和分块传输编码是互斥的。

您应该省略Content-Length ,而应根据Wikipedia文章在每个块的开头添加块大小。

或者,换句话说,您需要在此行之前以十六进制输出块大小

responseIndex = add(response,filebuffer,responseIndex);

编辑 :请注意,您只需要提供块的大小,而不需要提供整个HTTP响应的大小。 在您的情况下,它应该仅是HTML正文的大小; 例如,看起来您的样本主体的大小将为30或31(十六进制)(不确定空白)。

因此,有3分:a)使用十六进制b)使用小写c)使用块的大小(在您的情况下为主体,因为您只有一个块)。 不包括HTTP元数据的大小。

首先使用块也有点可疑。 仅在开始生成响应时不知道响应大小的情况下才应使用它们。 在这里,您知道开始时的响应大小,可以使用Content-Length而不使用Transfer-Encoding: chunked

分块传输的重点是(对于重言式来说很抱歉)以分块形式发送数据。 浏览器不知道期望多少个块,因此您需要告诉它最后一个块。 协议指定最后一个块的大小应为0:

          HTTP/1.1 200 OK
          Transfer-Encoding: chunked
          Content-Type: text/html

          446\r\n
          Precisely 446 bytes of data
          0\r\n

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM