关于是否要做什么,目前的情况如何
Transfer-Encoding: gzip
Run Code Online (Sandbox Code Playgroud)
或者a
Content-Encoding: gzip
Run Code Online (Sandbox Code Playgroud)
当我想允许具有有限带宽的客户端表示他们愿意接受压缩响应并且服务器具有最终决定是否压缩时.
后者就是例如Apache的mod_deflate和IIS,如果你让它来处理压缩.根据要压缩的内容的大小,它将执行额外的操作Transfer-Encoding: chunked.
它还将包括一个Vary: Accept-Encoding已经暗示该问题的方法.Content-Encoding似乎是实体的一部分,因此将Content-Encoding金额更改为实体的更改,即不同的Accept-Encoding标头意味着例如缓存不能使用其相同实体的缓存版本.
有没有一个明确的答案,我已经错过了(并没有埋没在某个apache新闻组的长线程中的消息中)?
我目前的印象是:
ETag在透明地压缩响应时应该怎么做?)所以我假设正确的方式将是一个Transfer-Encoding: gzip(或者,如果我另外大块的身体,它将成为 Transfer-Encoding: gzip, chunked).并且没有理由在这种情况下触摸Vary或ETag任何其他标题,因为它是传输级别的东西.
现在我不太关心"逐跳"的问题Transfer-Encoding,其他人似乎首先关注的是,因为代理可能会解压缩并向客户端转发未压缩的东西.但是,如果原始请求具有正确的Accept-Encoding标头,则代理可能也可以原样转发(压缩),如果所有浏览器都知道给定的话.
顺便说一句,这个问题至少有十年之久,请参阅 https://bugzilla.mozilla.org/show_bug.cgi?id=68517.
任何有关这方面的澄清将不胜感激.无论是在符合标准的还是被认为是实用的方面.例如,仅支持透明"内容编码"的HTTP客户端库将成为反对实用性的论据.
我试图了解更多Transfer-Encoding:chunked.在PHP中引用了一些文章:http:
//zoompf.com/blog/2012/05/too-chunky和"Transfer-Encoding:chunked"标题.
我仍然没有得到非常清晰的画面.我知道设置此编码允许服务器将块中的内容设置为浏览器,并在使网站响应的同时导致部分内容呈现.
如果我在IBM WAS上托管了一个提供动态内容的Web应用程序(例如:基于JSF的Web应用程序),那么大多数Web页面都设计为服务器丰富的静态内容,包含大量的CSS和JS文件+动态内容.如何为我的页面设置transfer-encoding'chunked'?或者换句话说:
'Transfer-Encoding: chunked'以及如何为该页面设置该页面?您的个人经历对我的理解肯定是有价值的.
我可以简单地设置Transfer-Encoding标题吗?
Response.Flush()在某些时候打电话会导致这种情况发生吗?
编辑
不,我不能打电话给Response.Headers.Add("Transfer-Encoding","anything"); 那个投掷.
还有其他建议吗?
我通过Node.JS提供未知长度的资源.因此,Content-Length无法设置标头.对于HTTP 1.1,需要将chunked编码用于此类资源.Node.JS知道这一点并使用chunked transfer encoding自己发送我的数据,具有以下标头:
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Connection: close
...
Run Code Online (Sandbox Code Playgroud)
对于行为良好的客户来说,这一切都很好. 但是,我必须支持一些表现不佳的客户端(即Android 2.2及更早版本). 这些客户端不支持正确的分块传输编码.
我最初的想法是将编码设置为none如此:
response.writeHead(200, {'Transfer-Encoding': 'none'});
Run Code Online (Sandbox Code Playgroud)
这会禁用Node.JS的自动分块编码,并保持与大多数客户端的兼容性.然而,现在我已经破坏了Android 2.3+客户端,因为当他们看到这样一个虚假的传输编码头时,他们只是咳嗽和窒息.
当我发出请求时HTTP/1.0,服务器正确地返回没有分块编码的响应:
HTTP/1.1 200 OK
Connection: close
...
Run Code Online (Sandbox Code Playgroud)
这解决了我的问题,并允许我提供适用于我所有麻烦客户的流.我不必发送伪造的标题Transfer-Encoding,我仍然不必指定内容的长度.
如何强制Node.JS的HTTP服务器始终以HTTP/1.0模式提供服务?
使用Varnish 4,我有一组后端,它们响应有效的Content-Length标头而没有Transfer-Encoding标头.
在客户端的第一次点击中,Varnish正在删除Content-Length标题并添加Transfer-Encoding: chunked到响应中,而不是使用这些标头响应客户端.(有趣的是,有效载荷似乎没有任何块 - 它是一个连续的有效载荷).
这会给像Flash视频播放器这样的客户端造成严重问题,这些客户端正试图根据Content-Length标头进行分段大小,带宽等分析.他们的分析失败了,他们不能做多比特流等等.
我尝试过一些半明显的事情,比如:
beresp.do_stream = true beresp.do_gzip = falseunset req.http.Accept-Encoding示例后端响应:
HTTP/1.1 200 OK
Cache-Control: public, max-age=600
Content-Type: video/mp4
Date: Tue, 13 May 2014 19:44:35 GMT
Server: Apache
Content-Length: 796618
Connection: keep-alive
Run Code Online (Sandbox Code Playgroud)
样品清漆响应:
HTTP/1.1 200 OK
Server: Apache
Cache-Control: public, max-age=600
Content-Type: video/mp4
Date: Tue, 13 May 2014 23:10:06 GMT
X-Varnish: 2
Age: 0
Transfer-Encoding: chunked
Accept-Ranges: bytes
Run Code Online (Sandbox Code Playgroud)
对象的后续加载不包括Content-Length …
我有一个REST API,通过HTTP Post接受音频文件.API支持Transfer-Encoding:chunked请求标头,以便在从客户端上运行的记录器创建文件时,可以将文件分段上传.这样,服务器可以在文件到达时开始处理文件以提高性能.例如:
HTTP 1.1 POST .../v1/processAudio
转移编码:分块
[Chunk 1 256 Bytes](服务器到达时开始处理)
[块2 256字节]
[块3 256字节]
...
音频文件通常较短,大小约为10K到100K.我有C#和Java代码正在工作,所以我知道API工作.但是,我似乎无法使用javascript在浏览器中进行录制和上传工作.
这是我的测试代码,使用Transfer-Encoding对localhost执行POST:
<html>
<script type="text/javascript">
function streamUpload() {
var blob = new Blob(['GmnQPBU+nyRGER4JPAW4DjDQC19D']);
var xhr = new XMLHttpRequest();
// Add any event handlers here...
xhr.open('POST', '/', true);
xhr.setRequestHeader("Transfer-Encoding", "chunked");
xhr.send(blob);
}
</script>
<body>
<div id='demo'>Test Chunked Upload using XHR</div>
<button onclick="streamUpload()">Start Upload</button>
</body>
</html>Run Code Online (Sandbox Code Playgroud)
问题是我在Chrome中收到以下错误
拒绝设置不安全的标题"Transfer-Encoding"
streamUpload @ uploadTest.html:14 onclick @ uploadTest.html:24
在查看XHR文档后,我仍然感到困惑,因为它没有讨论不安全的请求标头.我想知道XHR是否可能不允许或实现Transfer-Encoding:为HTTP POST 分块?
我已经看过使用多个XHR.send()请求和WebSockets的工作,但两者都是不受欢迎的,因为它需要对已经存在的服务器API进行重大更改,简单,稳定和有效.唯一的问题是我们似乎无法通过Transfer-Encoding从具有psedo-streaming的浏览器POST:chunked request header.
任何想法或建议都会非常有帮助.
我们正在使用Apache httpd实现一些其他API.我们有一个API,可以响应9k缓冲区.每当我们的响应超过8k时,Apache将在响应头中附加"Transfer-Encoding:chunked",Apache将丢弃其余的响应头.
我想在我们的响应缓冲区超过8K时禁用"Transfer-Encoding:chunked"响应头,以保留我们有用的响应头.
任何人都可以给我一些想法吗?
该w3.org(RFC2616),似乎没有定义块的最大尺寸.但是如果没有最大块大小,则没有空间用于块扩展.必须有一个最大的块大小,否则我不能忽略块扩展,因为我不建议如果它无法理解(Quote :) "MUST ignore chunk-extension extensions they do not understand".
我正在试验一个简单的NodeJS HTTP服务器的各种响应.我想要实现的效果是更快的网页视觉呈现.由于响应是通过transfer-encoding: chunked(右?)流式传输到浏览器的,我以为我可以先渲染页面布局,然后在延迟后再渲染其余的数据.
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {
'Content-Type': 'text/html'
, 'Transfer-Encoding': 'chunked'
});
res.write('<html>\n');
res.write('<body>\n');
res.write('hello ');
res.write('</body>\n');
res.write('</html>\n');
setTimeout(function () {
res.end('world');
},1500);
}).listen(3000, '127.0.0.1');
Run Code Online (Sandbox Code Playgroud)
问题是,res.end('world')除非已经写入的数据足够长,否则似乎没有发送响应,所以例如res.write(new Array(2000).join('1'))而不是那样res.write('hello'),就可以做到这一点.
Node是否会缓冲我的写入,直到数据足够大才能发送?如果是这种情况,块大小是否可配置?
我在 IIS 8.5 上运行了 ASP.NET Web API,我的 POST 方法接受了一个 json 文档主体。现在客户端应用程序正在使用 apache httpclient,它显然会自动将 Transfer-Encoding: chunked 标头添加到请求中。由于主体不存在,我的 API 方法抛出异常 - 它无法反序列化主体中的 json,即使它在客户端日志中看起来不错。
我应该如何处理请求以确保我得到整个身体?我猜 IIS 也应该支持请求的传输编码,因为它是 HTTP/1.1 规范的一部分,对吧?
有一个类似的问题没有回答:Reading Body on chunked transfer encoding http requests in ASP.NET