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());
+}