From c79957a3064f2514acd632144d8774272ac307e4 Mon Sep 17 00:00:00 2001 From: lxs Date: Mon, 1 Oct 2018 15:40:19 +0800 Subject: [PATCH] fix: #2327, Host header is not required in UNIX Domain Sockets --- request.js | 2 +- tests/server.js | 13 +++++++++++++ tests/test-headers.js | 25 +++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/request.js b/request.js index 90bed4f4a..9c5d5e6f9 100644 --- a/request.js +++ b/request.js @@ -285,7 +285,7 @@ Request.prototype.init = function (options) { self._redirect.onRequest(options) self.setHost = false - if (!self.hasHeader('host')) { + if (!self.hasHeader('host') && !self.uri.isUnix) { var hostHeaderName = self.originalHostHeaderName || 'host' self.setHeader(hostHeaderName, self.uri.host) // Drop :port suffix from Host header if known protocol. diff --git a/tests/server.js b/tests/server.js index 93a68913d..3eeec7cc3 100644 --- a/tests/server.js +++ b/tests/server.js @@ -71,6 +71,19 @@ exports.createSSLServer = function (opts) { return s } +exports.createUnixSockServer = function (unixSockPath) { + var s = http.createServer(function (req, resp) { + s.emit(req.url, req, resp) + }) + if (fs.existsSync(unixSockPath)) { + s.on('close', function () { + fs.unlinkSync(unixSockPath) + }) + } + s.listen(unixSockPath) + return s +} + exports.createPostStream = function (text) { var postStream = new stream.Stream() postStream.writeable = true diff --git a/tests/test-headers.js b/tests/test-headers.js index 68b748691..7dc07e5b8 100644 --- a/tests/test-headers.js +++ b/tests/test-headers.js @@ -263,6 +263,31 @@ tape('catch invalid characters error - POST', function (t) { }) }) +tape('Host header is not required when use UNIX Domain Sockets', function (t) { + if (os.platform() === 'win32') { + t.end() + } + var sockPath = '/tmp/request.sock' + var sockServer = server.createUnixSockServer(sockPath) + sockServer.on('/', function (req, res) { + res.writeHead(200, { + 'Content-Type': 'application/json' + }) + res.end(JSON.stringify(req.headers)) + }) + + request({ + method: 'GET', + url: 'http://unix:' + sockPath + ':/', + json: true + }, function (err, res, body) { + t.equal(err, null) + t.equal(typeof body['host'], 'undefined') + sockServer.close() + t.end() + }) +}) + if (hasIPv6interface) { tape('IPv6 Host header', function (t) { // Horrible hack to observe the raw data coming to the server