From 4b6d3bb9d0428d76ca6efea5598b1cbb85ba67ec Mon Sep 17 00:00:00 2001 From: avwo Date: Wed, 26 Aug 2020 21:29:16 +0800 Subject: [PATCH] feat: add trailers --- lib/https/h2.js | 5 ++++- lib/https/index.js | 9 +++++++++ lib/inspectors/res.js | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/lib/https/h2.js b/lib/https/h2.js index 81e9fadc9..35d608ddc 100644 --- a/lib/https/h2.js +++ b/lib/https/h2.js @@ -219,6 +219,9 @@ function requestH2(client, req, res, callback) { var newHeaders = {}; var statusCode = h2Headers[':status']; var svrRes = h2Session; + svrRes.on('trailers', function(trailers) { + svrRes.trailers = trailers; + }); svrRes.statusCode = statusCode; // HTTP2 对响应内容格式要求太严格(NGHTTP2_PROTOCOL_ERROR) if (!util.hasBody(svrRes, req)) { @@ -230,7 +233,7 @@ function requestH2(client, req, res, callback) { svrRes.httpVersion = '1.1'; svrRes.headers = newHeaders; Object.keys(h2Headers).forEach(function(name) { - if (name[0] !== ':') { + if (name[0] !== ':' && name !== 'content-length') { newHeaders[name] = h2Headers[name]; } }); diff --git a/lib/https/index.js b/lib/https/index.js index 731507066..1fdc01f84 100644 --- a/lib/https/index.js +++ b/lib/https/index.js @@ -781,6 +781,15 @@ function toHttp1(req, res) { client.on('error', handleError); client.on('response', function(svrRes) { svrRes.on('error', handleError); + svrRes.once('end', function() { + var trailers = svrRes.trailers; + if (!util.isEmptyObject(trailers)) { + var rawHeaderNames = svrRes.rawTrailers ? getRawHeaderNames(svrRes.rawTrailers) : null; + try { + res.addTrailers(formatHeaders(trailers, rawHeaderNames)); + } catch (e) {} + } + }); try { var code = svrRes.statusCode; res.writeHead(code, getStatusMessage(svrRes), formatRawHeaders(svrRes, isH2)); diff --git a/lib/inspectors/res.js b/lib/inspectors/res.js index 2045d4521..7fb5cf824 100644 --- a/lib/inspectors/res.js +++ b/lib/inspectors/res.js @@ -864,7 +864,7 @@ module.exports = function(req, res, next) { Object.keys(resHeaders).forEach(function(prop) { delete headers[prop]; }); - _res.on('end', function() { + _res.once('end', function() { var trailers = _res.trailers; if (!res.chunkedEncoding || req.disable.trailers || req.disable.trailer || (util.isEmptyObject(trailers) && util.isEmptyObject(newTrailers))) {