Skip to content
This repository was archived by the owner on Jul 6, 2018. It is now read-only.

Commit ebb3157

Browse files
http2: fix res.setHeader to update linkedlist APIs
1 parent 7e862f3 commit ebb3157

File tree

2 files changed

+53
-3
lines changed

2 files changed

+53
-3
lines changed

lib/internal/http2/compat.js

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ function setHeader(list, name, value) {
3636
function llistToHeaders(list, count) {
3737
var ret = {};
3838
while (!linkedList.isEmpty(list)) {
39-
var item = linkedList.shift(list);
39+
var item = list._idlePrev;
40+
linkedList.remove(item);
4041
var key = item[0];
4142

4243
if (ret[key]) {
@@ -279,8 +280,18 @@ class Http2ServerResponse extends Stream {
279280
};
280281
this[kStream] = stream;
281282
stream[kResponse] = this;
282-
this[kHeaders] = linkedList.create();
283-
this[kTrailers] = linkedList.create();
283+
var headerList = {
284+
_idleNext: null,
285+
_idlePrev: null,
286+
};
287+
linkedList.init(headerList);
288+
this[kHeaders] = headerList;
289+
var trailersList = {
290+
_idleNext: null,
291+
_idlePrev: null,
292+
};
293+
linkedList.init(trailersList);
294+
this[kHeaders] = trailersList;
284295
this.writable = true;
285296
stream.on('drain', onStreamResponseDrain);
286297
stream.on('error', onStreamResponseError);
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
'use strict';
2+
3+
const common = require('../common');
4+
const assert = require('assert');
5+
const http2 = require('http2');
6+
const path = require('path');
7+
const tls = require('tls');
8+
const net = require('net');
9+
const fs = require('fs');
10+
const body =
11+
'<html><head></head><body><h1>this is some data</h2></body></html>';
12+
13+
const server = http2.createServer((req, res) => {
14+
res.setHeader('foobar', 'baz');
15+
res.setHeader('X-POWERED-BY', 'node-test');
16+
res.end(body);
17+
});
18+
19+
server.listen(0, common.mustCall(() => {
20+
const client = http2.connect(`http://localhost:${server.address().port}`);
21+
const headers = { ':path': '/' };
22+
const req = client.request(headers);
23+
req.setEncoding('utf8');
24+
req.on('response', common.mustCall(function(headers) {
25+
assert.strictEqual(headers['foobar'], 'baz');
26+
assert.strictEqual(headers['x-powered-by'], 'node-test');
27+
}));
28+
29+
let data = '';
30+
req.on('data', (d) => data += d);
31+
req.on('end', () => {
32+
assert.strictEqual(body, data);
33+
server.close();
34+
client.socket.destroy();
35+
});
36+
req.end();
37+
}));
38+
39+
server.on('error', common.mustNotCall());

0 commit comments

Comments
 (0)