diff --git a/packages/rocketchat-file-upload/package.js b/packages/rocketchat-file-upload/package.js index 85e698199a4a..91951ea1076b 100644 --- a/packages/rocketchat-file-upload/package.js +++ b/packages/rocketchat-file-upload/package.js @@ -31,6 +31,7 @@ Package.onUse(function(api) { api.addFiles('client/lib/fileUploadHandler.js', 'client'); api.addFiles('server/lib/FileUpload.js', 'server'); + api.addFiles('server/lib/proxy.js', 'server'); api.addFiles('server/lib/requests.js', 'server'); api.addFiles('server/config/_configUploadStorage.js', 'server'); diff --git a/packages/rocketchat-file-upload/server/lib/proxy.js b/packages/rocketchat-file-upload/server/lib/proxy.js new file mode 100644 index 000000000000..c5636478c757 --- /dev/null +++ b/packages/rocketchat-file-upload/server/lib/proxy.js @@ -0,0 +1,91 @@ +/* globals UploadFS, InstanceStatus */ + +import http from 'http'; +import URL from 'url'; + +const logger = new Logger('UploadProxy'); + +WebApp.connectHandlers.stack.unshift({ + route: '', + handle: Meteor.bindEnvironment(function(req, res, next) { + // Quick check to see if request should be catch + if (req.url.indexOf(UploadFS.config.storesPath) === -1) { + return next(); + } + + logger.debug('Upload URL:', req.url); + + if (req.method !== 'POST') { + return next(); + } + + // Remove store path + const parsedUrl = URL.parse(req.url); + const path = parsedUrl.pathname.substr(UploadFS.config.storesPath.length + 1); + + // Get store + const regExp = new RegExp('^\/([^\/\?]+)\/([^\/\?]+)$'); + const match = regExp.exec(path); + + // Request is not valid + if (match === null) { + res.writeHead(400); + res.end(); + return; + } + + // Get store + const store = UploadFS.getStore(match[1]); + if (!store) { + res.writeHead(404); + res.end(); + return; + } + + // Get file + const fileId = match[2]; + const file = store.getCollection().findOne({_id: fileId}); + if (file === undefined) { + res.writeHead(404); + res.end(); + return; + } + + if (file.instanceId === InstanceStatus.id()) { + logger.debug('Correct instance'); + return next(); + } + + // Proxy to other instance + const instance = InstanceStatus.getCollection().findOne({_id: file.instanceId}); + + if (instance == null) { + res.writeHead(404); + res.end(); + return; + } + + if (instance.extraInformation.host === process.env.INSTANCE_IP && RocketChat.isDocker() === false) { + instance.extraInformation.host = 'localhost'; + } + + logger.debug('Wrong instance, proxing to:', `${ instance.extraInformation.host }:${ instance.extraInformation.port }`); + + const options = { + hostname: instance.extraInformation.host, + port: instance.extraInformation.port, + path: req.url, + method: 'POST' + }; + + const proxy = http.request(options, function(proxy_res) { + proxy_res.pipe(res, { + end: true + }); + }); + + req.pipe(proxy, { + end: true + }); + }) +}); diff --git a/server/startup/avatar.js b/server/startup/avatar.js index eceb9f0aa7bc..24e29960fa43 100644 --- a/server/startup/avatar.js +++ b/server/startup/avatar.js @@ -1,94 +1,4 @@ -/* globals FileUpload, UploadFS, InstanceStatus */ - -import http from 'http'; -import URL from 'url'; - -const logger = new Logger('UploadProxy'); - -WebApp.connectHandlers.stack.unshift({ - route: '', - handle: Meteor.bindEnvironment(function(req, res, next) { - // Quick check to see if request should be catch - if (req.url.indexOf(UploadFS.config.storesPath) === -1) { - return next(); - } - - logger.debug('Upload URL:', req.url); - - if (req.method !== 'POST') { - return next(); - } - - // Remove store path - const parsedUrl = URL.parse(req.url); - const path = parsedUrl.pathname.substr(UploadFS.config.storesPath.length + 1); - - // Get store - const regExp = new RegExp('^\/([^\/\?]+)\/([^\/\?]+)$'); - const match = regExp.exec(path); - - // Request is not valid - if (match === null) { - res.writeHead(400); - res.end(); - return; - } - - // Get store - const store = UploadFS.getStore(match[1]); - if (!store) { - res.writeHead(404); - res.end(); - return; - } - - // Get file - const fileId = match[2]; - const file = store.getCollection().findOne({_id: fileId}); - if (file === undefined) { - res.writeHead(404); - res.end(); - return; - } - - if (file.instanceId === InstanceStatus.id()) { - logger.debug('Correct instance'); - return next(); - } - - // Proxy to other instance - const instance = InstanceStatus.getCollection().findOne({_id: file.instanceId}); - - if (instance == null) { - res.writeHead(404); - res.end(); - return; - } - - if (instance.extraInformation.host === process.env.INSTANCE_IP && RocketChat.isDocker() === false) { - instance.extraInformation.host = 'localhost'; - } - - logger.debug('Wrong instance, proxing to:', `${ instance.extraInformation.host }:${ instance.extraInformation.port }`); - - const options = { - hostname: instance.extraInformation.host, - port: instance.extraInformation.port, - path: req.url, - method: 'POST' - }; - - const proxy = http.request(options, function(proxy_res) { - proxy_res.pipe(res, { - end: true - }); - }); - - req.pipe(proxy, { - end: true - }); - }) -}); +/* globals FileUpload */ Meteor.startup(function() { WebApp.connectHandlers.use('/avatar/', Meteor.bindEnvironment(function(req, res/*, next*/) {