Skip to content

Commit ad470e4

Browse files
evanlucasrvagg
authored andcommitted
http: disallow sending obviously invalid status codes
Back port of 7e9b0dd 3d6225 to v0.12. PR-URL: nodejs-private/node-private#47 Reviewed-By: Rod Vagg <[email protected]> Reviewed-By: Fedor Indutny <[email protected]> Reviewed-By: Douglas Wilson <[email protected]>
1 parent b6e0105 commit ad470e4

File tree

2 files changed

+96
-0
lines changed

2 files changed

+96
-0
lines changed

lib/_http_server.js

+4
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,10 @@ ServerResponse.prototype.writeHead = function(statusCode, reason, obj) {
202202
headers = obj;
203203
}
204204

205+
statusCode |= 0;
206+
if (statusCode < 100 || statusCode > 999)
207+
throw new RangeError('Invalid status code: ' + statusCode);
208+
205209
var statusLine = 'HTTP/1.1 ' + statusCode.toString() + ' ' +
206210
this.statusMessage + CRLF;
207211

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

0 commit comments

Comments
 (0)