diff --git a/doc/api/errors.md b/doc/api/errors.md index 4757496fa6ac93..fbc4db0631ac04 100644 --- a/doc/api/errors.md +++ b/doc/api/errors.md @@ -826,6 +826,12 @@ An invalid symlink type was passed to the [`fs.symlink()`][] or An attempt was made to add more headers after the headers had already been sent. + +### ERR_HTTP_INCOMING_SOCKET_ENCODING + +An attempt to set text encoding of a HTTP request or response `Socket` +is not permitted. [RFC7230 Section 3][rfc7230-3] + ### ERR_HTTP_INVALID_HEADER_VALUE @@ -2104,3 +2110,6 @@ size. [try-catch]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/try...catch [vm]: vm.html [WHATWG Supported Encodings]: util.html#util_whatwg_supported_encodings +[`zlib`]: zlib.html + +[rfc7230-3]: https://tools.ietf.org/html/rfc7230#section-3 diff --git a/lib/_http_server.js b/lib/_http_server.js index 6e1b2c90e5351d..017a038ec5069c 100644 --- a/lib/_http_server.js +++ b/lib/_http_server.js @@ -46,6 +46,7 @@ const { const { IncomingMessage } = require('_http_incoming'); const { ERR_HTTP_HEADERS_SENT, + ERR_HTTP_INCOMING_SOCKET_ENCODING, ERR_HTTP_INVALID_STATUS_CODE, ERR_INVALID_CHAR } = require('internal/errors').codes; @@ -380,6 +381,7 @@ function connectionListenerInternal(server, socket) { // Override on to unconsume on `data`, `readable` listeners socket.on = socketOnWrap; + socket.setEncoding = socketSetEncoding; // We only consume the socket if it has never been consumed before. if (socket._handle) { @@ -694,6 +696,10 @@ function onSocketPause() { } } +function socketSetEncoding() { + throw new ERR_HTTP_INCOMING_SOCKET_ENCODING('setEncoding'); +} + function unconsume(parser, socket) { if (socket._handle) { if (parser._consumed) diff --git a/lib/internal/errors.js b/lib/internal/errors.js index 0520fbbc6f6668..45bbe91b8a87dd 100644 --- a/lib/internal/errors.js +++ b/lib/internal/errors.js @@ -603,6 +603,9 @@ E('ERR_HTTP2_TRAILERS_NOT_READY', E('ERR_HTTP2_UNSUPPORTED_PROTOCOL', 'protocol "%s" is unsupported.', Error); E('ERR_HTTP_HEADERS_SENT', 'Cannot %s headers after they are sent to the client', Error); +E('ERR_HTTP_INCOMING_SOCKET_ENCODING', + 'Changing the incoming socket encoding is not possible (RFC7230 Section 3)', + Error); E('ERR_HTTP_INVALID_HEADER_VALUE', 'Invalid value "%s" for header "%s"', TypeError); E('ERR_HTTP_INVALID_STATUS_CODE', 'Invalid status code: %s', RangeError); diff --git a/test/parallel/test-http-socket-encoding-error.js b/test/parallel/test-http-socket-encoding-error.js new file mode 100644 index 00000000000000..58a22b9fb6400e --- /dev/null +++ b/test/parallel/test-http-socket-encoding-error.js @@ -0,0 +1,23 @@ +'use strict'; + +const common = require('../common'); +const http = require('http'); + +const server = http.createServer().listen(0, connectToServer); + +server.on('connection', (socket) => { + common.expectsError(() => socket.setEncoding(''), + { + code: 'ERR_HTTP_INCOMING_SOCKET_ENCODING', + type: Error + }); + + socket.end(); +}); + +function connectToServer() { + const client = new http.Agent().createConnection(this.address().port, () => { + client.end(); + }) + .on('end', () => server.close()); +}