1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-09-21 01:38:48 +02:00

Make paths and Aphlict instance names less ambiguous

Summary:
Fixes T10783 (what little of it remains). Ref T10697.

Aphlict currently uses request paths for two different things:

  - multi-tenant instancing in the Phacility cluster (each instance gets its own namespace within an Aphlict server);
  - some users configure nginx and apache to do proxying or SSL termination based on the path.

Currently, these can collide.

Put a "~" before the instance name to make it unambiguous. At some point we can possibly just use a GET parameter, but I think there was some reason I didn't do that originally and this sequence of changes is disruptive enough already.

Test Plan: Saw local Aphlict unambiguously recognize "local.phacility.com" as instance "local", with a "~"-style URI.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T10697, T10783

Differential Revision: https://secure.phabricator.com/D15705
This commit is contained in:
epriestley 2016-04-13 16:08:07 -07:00
parent 2930733ac9
commit d4bf2a147b
2 changed files with 22 additions and 7 deletions

View file

@ -162,7 +162,7 @@ final class PhabricatorNotificationServerRef
public function getWebsocketURI($to_path = null) {
$instance = PhabricatorEnv::getEnvConfig('cluster.instance');
if (strlen($instance)) {
$to_path = $to_path.$instance.'/';
$to_path = $to_path.'~'.$instance.'/';
}
$uri = $this->getURI($to_path);

View file

@ -52,18 +52,33 @@ JX.install('AphlictClientServer', {
response.end('HTTP/501 Use Websockets\n');
},
_parseInstanceFromPath: function(path) {
// If there's no "~" marker in the path, it's not an instance name.
// Users sometimes configure nginx or Apache to proxy based on the
// path.
if (path.indexOf('~') === -1) {
return 'default';
}
var instance = path.split('~')[1];
// Remove any "/" characters.
instance = instance.replace(/\//g, '');
if (!instance.length) {
return 'default';
}
return instance;
},
listen: function() {
var self = this;
var server = this._server.listen.apply(this._server, arguments);
var wss = new WebSocket.Server({server: server});
wss.on('connection', function(ws) {
var instance = url.parse(ws.upgradeReq.url).pathname;
instance = instance.replace(/\//g, '');
if (!instance.length) {
instance = 'default';
}
var path = url.parse(ws.upgradeReq.url).pathname;
var instance = self._parseInstanceFromPath(path);
var listener = self.getListenerList(instance).addListener(ws);