The communications platform that puts data protection first.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
Rocket.Chat/packages/rocketchat-file-upload/server/lib/proxy.js

93 lines
2.1 KiB

/* globals UploadFS, InstanceStatus */
import { Meteor } from 'meteor/meteor';
import { WebApp } from 'meteor/webapp';
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.originalUrl,
method: 'POST',
};
const proxy = http.request(options, function(proxy_res) {
proxy_res.pipe(res, {
end: true,
});
});
req.pipe(proxy, {
end: true,
});
}),
});