mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-10 17:02:41 +01: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:
parent
2930733ac9
commit
d4bf2a147b
2 changed files with 22 additions and 7 deletions
|
@ -162,7 +162,7 @@ final class PhabricatorNotificationServerRef
|
||||||
public function getWebsocketURI($to_path = null) {
|
public function getWebsocketURI($to_path = null) {
|
||||||
$instance = PhabricatorEnv::getEnvConfig('cluster.instance');
|
$instance = PhabricatorEnv::getEnvConfig('cluster.instance');
|
||||||
if (strlen($instance)) {
|
if (strlen($instance)) {
|
||||||
$to_path = $to_path.$instance.'/';
|
$to_path = $to_path.'~'.$instance.'/';
|
||||||
}
|
}
|
||||||
|
|
||||||
$uri = $this->getURI($to_path);
|
$uri = $this->getURI($to_path);
|
||||||
|
|
|
@ -52,18 +52,33 @@ JX.install('AphlictClientServer', {
|
||||||
response.end('HTTP/501 Use Websockets\n');
|
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() {
|
listen: function() {
|
||||||
var self = this;
|
var self = this;
|
||||||
var server = this._server.listen.apply(this._server, arguments);
|
var server = this._server.listen.apply(this._server, arguments);
|
||||||
var wss = new WebSocket.Server({server: server});
|
var wss = new WebSocket.Server({server: server});
|
||||||
|
|
||||||
wss.on('connection', function(ws) {
|
wss.on('connection', function(ws) {
|
||||||
var instance = url.parse(ws.upgradeReq.url).pathname;
|
var path = url.parse(ws.upgradeReq.url).pathname;
|
||||||
|
var instance = self._parseInstanceFromPath(path);
|
||||||
instance = instance.replace(/\//g, '');
|
|
||||||
if (!instance.length) {
|
|
||||||
instance = 'default';
|
|
||||||
}
|
|
||||||
|
|
||||||
var listener = self.getListenerList(instance).addListener(ws);
|
var listener = self.getListenerList(instance).addListener(ws);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue