【问题标题】:Transfer-Encoding: chunked-- Browser does not respondTransfer-Encoding: chunked--浏览器没有响应
【发布时间】:2015-03-26 17:11:38
【问题描述】:

我在我的 LINUX 机器上使用 C 语言的 TCP 套接字编程制作了一个非常简单的 Web 服务器。我从本地机器的浏览器(chrome 和 mozilla)向它发送 HTTP GET 请求。 这个问题是当我没有在响应中设置 header
Transfer-Encoding: chunked 时,浏览器成功显示网页。 但是当我保留这个标题时,浏览器没有响应,它说 NO DATA IS AVAILABLE

编辑:在我添加@RomanK 指出的块大小(446 字节)之后,它现在适用于 firefox。 但是 chrome 变得没有响应。

这里是代码

 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 只是一个用于跟踪当前响应长度的 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

【问题讨论】:

  • 完成。请看@GoBusto。
  • 请注意,我将文件作为 446 字节的单个块发送。我不知道如何将文件作为多个块发送。

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


【解决方案1】:

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

您应该省略Content-Length,而是按照Wikipedia article 在每个块的开头添加块大小。

或者,换句话说,你需要在这一行之前输出十六进制的块大小

responseIndex = add(response,filebuffer,responseIndex);

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

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

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

【讨论】:

  • 非常感谢。虽然它现在适用于 Firefox,但 chrome 显示出一种奇怪的行为。Chrome 只是挂起,页面变得无响应。我在正文之前添加了 446(这是我的页面的长度)。为此,我还尝试了 446 的十六进制版本
  • 您能否编辑您的问题并在修复后提供新的 HTTP 响应?
  • 感谢您的编辑 - 相应地修改了我的答案。
  • 我使用了分块编码,因为我想了解一些关于 http 响应中所有标头的信息。在进行各种更改后,我仍然无法使其适用于 chrome。 :(
  • 我无能为力 - 您可能需要仔细阅读我在此处的回复和链接文章。
【解决方案2】:

分块传输的重点是(抱歉重言式)以块的形式发送数据。浏览器不知道需要多少块,所以你需要告诉它某个块是最后一个块。协议规定最后一个块的大小应为 0:

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

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

【讨论】:

  • 我已将最后一行 (0\r\n) 添加到响应中。它似乎仍然不适用于 chrome 。 Firefox 似乎也误解了最后一个 0 并将其与 html 正文一起显示在屏幕上。如果把整个代码放在pastebin上给你合适吗?
猜你喜欢
  • 1970-01-01
  • 2018-09-12
  • 2013-05-30
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
  • 1970-01-01
相关资源
最近更新 更多