Skip to content

Commit abd101b

Browse files
mscdexMyles Borins
authored and
Myles Borins
committed
http: disallow sending obviously invalid status codes
PR-URL: #6291 Reviewed-By: James M Snell <[email protected]> Reviewed-By: Sakthipriyan Vairamani <[email protected]> Reviewed-By: Сковорода Никита Андреевич <[email protected]> Reviewed-By: Fedor Indutny <[email protected]> Reviewed-By: Benjamin Gruenbaum <[email protected]> Reviewed-By: Colin Ihrig <[email protected]>
1 parent 4b83769 commit abd101b

File tree

2 files changed

+95
-0
lines changed

2 files changed

+95
-0
lines changed

lib/_http_server.js

+4
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,10 @@ ServerResponse.prototype.writeHead = function(statusCode, reason, obj) {
187187
headers = obj;
188188
}
189189

190+
statusCode |= 0;
191+
if (statusCode < 100 || statusCode > 999)
192+
throw new RangeError(`Invalid status code: ${statusCode}`);
193+
190194
var statusLine = 'HTTP/1.1 ' + statusCode.toString() + ' ' +
191195
this.statusMessage + CRLF;
192196

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
'use strict';
2+
const common = require('../common');
3+
const assert = require('assert');
4+
const http = require('http');
5+
6+
const MAX_REQUESTS = 12;
7+
var reqNum = 0;
8+
9+
const server = http.Server(common.mustCall(function(req, res) {
10+
switch (reqNum) {
11+
case 0:
12+
assert.throws(common.mustCall(() => {
13+
res.writeHead(-1);
14+
}, /invalid status code/i));
15+
break;
16+
case 1:
17+
assert.throws(common.mustCall(() => {
18+
res.writeHead(Infinity);
19+
}, /invalid status code/i));
20+
break;
21+
case 2:
22+
assert.throws(common.mustCall(() => {
23+
res.writeHead(NaN);
24+
}, /invalid status code/i));
25+
break;
26+
case 3:
27+
assert.throws(common.mustCall(() => {
28+
res.writeHead({});
29+
}, /invalid status code/i));
30+
break;
31+
case 4:
32+
assert.throws(common.mustCall(() => {
33+
res.writeHead(99);
34+
}, /invalid status code/i));
35+
break;
36+
case 5:
37+
assert.throws(common.mustCall(() => {
38+
res.writeHead(1000);
39+
}, /invalid status code/i));
40+
break;
41+
case 6:
42+
assert.throws(common.mustCall(() => {
43+
res.writeHead('1000');
44+
}, /invalid status code/i));
45+
break;
46+
case 7:
47+
assert.throws(common.mustCall(() => {
48+
res.writeHead(null);
49+
}, /invalid status code/i));
50+
break;
51+
case 8:
52+
assert.throws(common.mustCall(() => {
53+
res.writeHead(true);
54+
}, /invalid status code/i));
55+
break;
56+
case 9:
57+
assert.throws(common.mustCall(() => {
58+
res.writeHead([]);
59+
}, /invalid status code/i));
60+
break;
61+
case 10:
62+
assert.throws(common.mustCall(() => {
63+
res.writeHead('this is not valid');
64+
}, /invalid status code/i));
65+
break;
66+
case 11:
67+
assert.throws(common.mustCall(() => {
68+
res.writeHead('404 this is not valid either');
69+
}, /invalid status code/i));
70+
this.close();
71+
break;
72+
default:
73+
throw new Error('Unexpected request');
74+
}
75+
res.statusCode = 200;
76+
res.end();
77+
}, MAX_REQUESTS));
78+
server.listen();
79+
80+
server.on('listening', function makeRequest() {
81+
http.get({
82+
port: this.address().port
83+
}, (res) => {
84+
assert.strictEqual(res.statusCode, 200);
85+
res.on('end', () => {
86+
if (++reqNum < MAX_REQUESTS)
87+
makeRequest.call(this);
88+
});
89+
res.resume();
90+
});
91+
});

0 commit comments

Comments
 (0)