c - 传输编码 : chunked-- Browser does not respond

标签 c http httpresponse chunked-encoding http-chunked

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

编辑:在我添加了 @RomanK 指出的 block 大小(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

最佳答案

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

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

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

responseIndex = add(response,filebuffer,responseIndex);

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

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

首先使用 block 也有点值得怀疑;仅当您开始生成响应时不知道响应大小时才应使用它们。在这里,您知道开始时的响应大小,并且可以使用 Content-Length 而无需 Transfer-Encoding: chunked

关于c - 传输编码 : chunked-- Browser does not respond,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29284748/

相关文章:

java - Android 套接字读取字符串时出现错误

angularjs - Angular HTTP : Status -1 and CORS

python - 在 Django 中,如何在 HttpResponse 中转义 html?

java - Java 中的 HTTP 响应代码

python - Django FormView 响应

支持箭头键的标准输入跨平台输入解决方案?

c - 插入链表 C

无法在连接到服务器的多个客户端之间发送信息

angular - HttpParams 设置为空

angular - 在 Angular 中解析字符串时出现 http 失败