bra*_*ipt 7 http-headers node.js express
我在content-length节点服务器的响应中缺少一个标题,我正在从另一个位置输出.zip文件.我content-length通过下面的代码注入了一个标题,但似乎仍然transfer-encoding: chunked以某种方式覆盖它.
HTTP/1.1 200 OK
access-control-allow-origin: *
connection: close
content-type: application/zip
date: Mon, 14 Jul 2014 03:47:00 GMT
etag: "\"eb939974703e14ee9f578642972ed984\""
last-modified: Sat, 12 Jul 2014 02:15:52 GMT
server: Apache-Coyote/1.1
set-cookie: rememberMe=deleteMe; Path=/; Max-Age=0; Expires=Sun, 13-Jul-2014 03:47:00 GMT
transfer-encoding: chunked
X-Powered-By: Express
Run Code Online (Sandbox Code Playgroud)
var request = require('request');
var express = require('express');
var async = require('async');
var app = express();
app.get('/:bundle_id?', function(req, res) {
var bundle_id = req.params.bundle_id;
bundle_id = bundle_id.replace(/\.zip$/, '');
var url = "https://url....../bundles/" + bundle_id;
async.waterfall([
function(callback) {
request.get(url, function(req, res, data) {
callback(null, JSON.parse(data).entities[0]['file-metadata']['content-length']);
});
}
], function(err, contentLength) {
request.get({
url: url,
headers: {
"Accept": "application/zip"
}
}).pipe(res);
res.oldWriteHead = res.writeHead;
res.writeHead = function(statusCode, reasonPhrase, headers) {
res.header('Content-Length', contentLength);
res.oldWriteHead(statusCode, reasonPhrase, headers);
}
});
});
app.listen(9000);
Run Code Online (Sandbox Code Playgroud)
bra*_*ipt 10
事实证明这实际上是一个相当简单的修复:transfer-encoding在响应中将标题设置为空字符串解决了问题:
...
res.oldWriteHead = res.writeHead;
res.writeHead = function(statusCode, reasonPhrase, headers) {
res.header('Content-Length', contentLength);
res.header('transfer-encoding', ''); // <-- add this line
res.oldWriteHead(statusCode, reasonPhrase, headers);
}
...
Run Code Online (Sandbox Code Playgroud)
这样做的原因是因为在做了一些挖掘之后,它会出现transfer-encoding标题替换content-length(因为两者都不能共存).事实上,我用来测试的客户端是在内容长度上选择分块传输编码.
| 归档时间: |
|
| 查看次数: |
13221 次 |
| 最近记录: |