Skip to content

Commit 94070f1

Browse files
Y1D7NGtargos
authored andcommitted
http2: compat support for array headers
PR-URL: #42901 Reviewed-By: Robert Nagy <[email protected]> Reviewed-By: Paolo Insogna <[email protected]> Reviewed-By: Matteo Collina <[email protected]> Reviewed-By: Ricky Zhou <[email protected]> Reviewed-By: Rafael Gonzaga <[email protected]>
1 parent 7f8f83d commit 94070f1

File tree

3 files changed

+99
-37
lines changed

3 files changed

+99
-37
lines changed

‎doc/api/http2.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3922,7 +3922,7 @@ changes:
39223922

39233923
*`statusCode`{number}
39243924
*`statusMessage`{string}
3925-
*`headers`{Object}
3925+
*`headers`{Object|Array}
39263926
* Returns:{http2.Http2ServerResponse}
39273927

39283928
Sends a response header to the request. The status code is a 3-digit HTTP

‎lib/internal/http2/compat.js‎

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -682,9 +682,19 @@ class Http2ServerResponse extends Stream{
682682

683683
leti;
684684
if(ArrayIsArray(headers)){
685-
for(i=0;i<headers.length;i++){
686-
constheader=headers[i];
687-
this[kSetHeader](header[0],header[1]);
685+
if(headers.length&&ArrayIsArray(headers[0])){
686+
for(i=0;i<headers.length;i++){
687+
constheader=headers[i];
688+
this[kSetHeader](header[0],header[1]);
689+
}
690+
}else{
691+
if(headers.length%2!==0){
692+
thrownewERR_INVALID_ARG_VALUE('headers',headers);
693+
}
694+
695+
for(i=0;i<headers.length;i+=2){
696+
this[kSetHeader](headers[i],headers[i+1]);
697+
}
688698
}
689699
}elseif(typeofheaders==='object'){
690700
constkeys=ObjectKeys(headers);

‎test/parallel/test-http2-compat-serverresponse-writehead-array.js‎

Lines changed: 85 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -4,40 +4,92 @@ const common = require('../common');
44
if(!common.hasCrypto)
55
common.skip('missing crypto');
66
constassert=require('assert');
7-
consth2=require('http2');
8-
9-
// Http2ServerResponse.writeHead should support nested arrays
10-
11-
constserver=h2.createServer();
12-
server.listen(0,common.mustCall(()=>{
13-
constport=server.address().port;
14-
server.once('request',common.mustCall((request,response)=>{
15-
constreturnVal=response.writeHead(200,[
16-
['foo','bar'],
17-
['ABC',123],
18-
]);
19-
assert.strictEqual(returnVal,response);
20-
response.end(common.mustCall(()=>{server.close();}));
7+
consthttp2=require('http2');
8+
9+
// Http2ServerResponse.writeHead should support arrays and nested arrays
10+
11+
{
12+
constserver=http2.createServer();
13+
server.listen(0,common.mustCall(()=>{
14+
constport=server.address().port;
15+
16+
server.once('request',common.mustCall((request,response)=>{
17+
constreturnVal=response.writeHead(200,[
18+
['foo','bar'],
19+
['ABC',123],
20+
]);
21+
assert.strictEqual(returnVal,response);
22+
response.end(common.mustCall(()=>{server.close();}));
23+
}));
24+
25+
constclient=http2.connect(`http://localhost:${port}`,common.mustCall(()=>{
26+
constrequest=client.request();
27+
28+
request.on('response',common.mustCall((headers)=>{
29+
assert.strictEqual(headers.foo,'bar');
30+
assert.strictEqual(headers.abc,'123');
31+
assert.strictEqual(headers[':status'],200);
32+
},1));
33+
request.on('end',common.mustCall(()=>{
34+
client.close();
35+
}));
36+
request.end();
37+
request.resume();
38+
}));
2139
}));
40+
}
41+
42+
{
43+
constserver=http2.createServer();
44+
server.listen(0,common.mustCall(()=>{
45+
constport=server.address().port;
46+
47+
server.once('request',common.mustCall((request,response)=>{
48+
constreturnVal=response.writeHead(200,['foo','bar','ABC',123]);
49+
assert.strictEqual(returnVal,response);
50+
response.end(common.mustCall(()=>{server.close();}));
51+
}));
52+
53+
constclient=http2.connect(`http://localhost:${port}`,common.mustCall(()=>{
54+
constrequest=client.request();
55+
56+
request.on('response',common.mustCall((headers)=>{
57+
assert.strictEqual(headers.foo,'bar');
58+
assert.strictEqual(headers.abc,'123');
59+
assert.strictEqual(headers[':status'],200);
60+
},1));
61+
request.on('end',common.mustCall(()=>{
62+
client.close();
63+
}));
64+
request.end();
65+
request.resume();
66+
}));
67+
}));
68+
}
69+
70+
{
71+
constserver=http2.createServer();
72+
server.listen(0,common.mustCall(()=>{
73+
constport=server.address().port;
74+
75+
server.once('request',common.mustCall((request,response)=>{
76+
try{
77+
response.writeHead(200,['foo','bar','ABC',123,'extra']);
78+
}catch(err){
79+
assert.strictEqual(err.code,'ERR_INVALID_ARG_VALUE');
80+
}
81+
82+
response.end(common.mustCall(()=>{server.close();}));
83+
}));
84+
85+
constclient=http2.connect(`http://localhost:${port}`,common.mustCall(()=>{
86+
constrequest=client.request();
2287

23-
consturl=`http://localhost:${port}`;
24-
constclient=h2.connect(url,common.mustCall(()=>{
25-
constheaders={
26-
':path': '/',
27-
':method': 'GET',
28-
':scheme': 'http',
29-
':authority': `localhost:${port}`
30-
};
31-
constrequest=client.request(headers);
32-
request.on('response',common.mustCall((headers)=>{
33-
assert.strictEqual(headers.foo,'bar');
34-
assert.strictEqual(headers.abc,'123');
35-
assert.strictEqual(headers[':status'],200);
36-
},1));
37-
request.on('end',common.mustCall(()=>{
38-
client.close();
88+
request.on('end',common.mustCall(()=>{
89+
client.close();
90+
}));
91+
request.end();
92+
request.resume();
3993
}));
40-
request.end();
41-
request.resume();
4294
}));
43-
}));
95+
}

0 commit comments

Comments
(0)