Transfer-Encoding:chunked--浏览器没有响应

时间:2015-03-26 17:11:38

标签: c http httpresponse chunked-encoding http-chunked

我在我的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

2 个答案:

答案 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