首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Node.js:如何关闭分块传输编码?

Node.js:如何关闭分块传输编码?
EN

Stack Overflow用户
提问于 2014-07-14 11:58:48
回答 1查看 17K关注 0票数 10

我在从另一个位置通过管道传输.zip文件的Node服务器的响应中缺少content-length标头。我已经通过下面的代码注入了一个content-length头,但是看起来transfer-encoding: chunked还是以某种方式覆盖了它。

响应报头

代码语言:javascript
复制
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

代码

代码语言:javascript
复制
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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-15 00:05:57

事实证明,这实际上是一个相当简单的解决方案:在响应中将transfer-encoding头设置为空字符串解决了这个问题:

代码语言:javascript
复制
...
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);
}
...

这样做的原因是,在doing some digging之后,看起来transfer-encoding头替换了content-length (因为两者不能共存)。碰巧我用来测试的客户端选择了分块传输编码而不是内容长度。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24729329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档