Navigation Menu

Skip to content

Commit

Permalink
Detect base domain for endpoint automatically
Browse files Browse the repository at this point in the history
  • Loading branch information
piroor committed Aug 15, 2012
1 parent 2c7db17 commit 48d7645
Show file tree
Hide file tree
Showing 4 changed files with 137 additions and 17 deletions.
21 changes: 14 additions & 7 deletions lib/api/2011-02-01/configuration.js
Expand Up @@ -24,16 +24,23 @@ function createCommonErrorResponse(errorCode, error) {

var handlers = Object.create(null);

var defaultHttpPort = 80;
var defaultBaseHost = '127.0.0.1.xip.io';

function getBaseHostAndPort(config, request) {
var host = config.baseHost ||
request.headers.http_x_forwarded_host ||
request.headers.host ||
defaultBaseHost + ':' + config.port;
var port = defaultHttpPort;

function getBaseHostAndPort(config) {
var host = config.baseHost;
var port = config.port;
var portMatching = host.match(/:(\d+)$/);
if (portMatching) {
host = host.replace(portMatching[0], '');
port = parseInt(portMatching[1]);
}
if (port == 80)

if (port == defaultHttpPort)
return host;
else
return host + ':' + port;
Expand Down Expand Up @@ -89,7 +96,7 @@ handlers.CreateDomain = function(context, request, response, config) {
response.contentType('application/xml');
response.send(createCreateDomainResponse({
domain: domain,
hostAndPort: getBaseHostAndPort(config),
hostAndPort: getBaseHostAndPort(config, request),
created: true
}));
} catch (error) {
Expand Down Expand Up @@ -119,7 +126,7 @@ handlers.DeleteDomain = function(context, request, response, config) {
response.contentType('application/xml');
response.send(createDeleteDomainResponse({
domain: domain,
hostAndPort: getBaseHostAndPort(config),
hostAndPort: getBaseHostAndPort(config, request),
deleted: true
}));
} catch (error) {
Expand Down Expand Up @@ -172,7 +179,7 @@ handlers.DescribeDomains = function(context, request, response, config) {
response.contentType('application/xml');
response.send(createDescribeDomainsResponse({
domains: domains,
hostAndPort: getBaseHostAndPort(config)
hostAndPort: getBaseHostAndPort(config, request)
}));
} catch (error) {
var body = createCommonErrorResponse('InternalFailure',
Expand Down
3 changes: 0 additions & 3 deletions lib/server.js
Expand Up @@ -8,9 +8,6 @@ exports.createServer = function (config) {
if (!config.databasePath) config.databasePath = CLI.databasePath;
if (!config.privilege) config.privilege = CLI.privilege;
if (!config.port) config.port = CLI.port;
if (!config.baseHost) config.baseHost = CLI.defaultBaseHost;
if (!config.configurationHost)
config.configurationHost = CLI.defaultConfigurationHost;

var context = config.context || new nroonga.Context(config.databasePath);
var application = express.createServer();
Expand Down
115 changes: 115 additions & 0 deletions test/api-configuration.test.js
Expand Up @@ -359,6 +359,121 @@ suite('Configuration API', function() {
});
});

suite('auto detection of the base hostname and port', function() {
var temporaryDatabase;
var context;
var server;

setup(function() {
temporaryDatabase = utils.createTemporaryDatabase();
context = temporaryDatabase.get();
server = utils.setupServer(context);
});

teardown(function() {
server.close();
temporaryDatabase.teardown();
temporaryDatabase = undefined;
});

function assertBaseHost(baseHost, response) {
response = toParsedResponse(response);
assert.deepEqual(response.pattern,
{ statusCode: 200,
body: PATTERN_CreateDomainResponse });
var domain = new Domain('companies', context);
var status = response.body.CreateDomainResponse.CreateDomainResult.DomainStatus;
assert.deepEqual(
{ documentsEndpoint: status.DocService.Endpoint,
searchEndpoint: status.SearchService.Endpoint },
{ documentsEndpoint: domain.getDocumentsEndpoint(baseHost),
searchEndpoint: domain.getSearchEndpoint(baseHost) }
);
}

test('specified by server option', function(done) {
var baseHost = 'by.server.option';
server.close();
server = utils.setupServer(context, { baseHost: baseHost });
utils
.get('/?DomainName=companies&Action=CreateDomain&Version=2011-02-01')
.next(function(response) {
assertBaseHost(baseHost, response);
done();
})
.error(function(error) {
done(error);
});
});

test('specified by Host header', function(done) {
var baseHost = 'by.host.header';
utils
.get('/?DomainName=companies&Action=CreateDomain&Version=2011-02-01', {
'Host': baseHost
})
.next(function(response) {
assertBaseHost(baseHost, response);
done();
})
.error(function(error) {
done(error);
});
});

test('specified by HTTP_X_FORWARDED_HOST header', function(done) {
var baseHost = 'by.forwarded.host.header';
utils
.get('/?DomainName=companies&Action=CreateDomain&Version=2011-02-01', {
'HTTP_X_FORWARDED_HOST': baseHost
})
.next(function(response) {
assertBaseHost(baseHost, response);
done();
})
.error(function(error) {
done(error);
});
});

test('HTTP_X_FORWARDED_HOST and Host header', function(done) {
var baseHost = 'by.host.header';
var baseHostForwarded = 'by.forwarded.host.header';
utils
.get('/?DomainName=companies&Action=CreateDomain&Version=2011-02-01', {
'Host': baseHost,
'HTTP_X_FORWARDED_HOST': baseHostForwarded
})
.next(function(response) {
assertBaseHost(baseHostForwarded, response);
done();
})
.error(function(error) {
done(error);
});
});

test('HTTP_X_FORWARDED_HOST, Host header, and server option', function(done) {
var baseHostByOption = 'by.server.option';
server.close();
server = utils.setupServer(context, { baseHost: baseHostByOption });
var baseHost = 'by.host.header';
var baseHostForwarded = 'by.forwarded.host.header';
utils
.get('/?DomainName=companies&Action=CreateDomain&Version=2011-02-01', {
'Host': baseHost,
'HTTP_X_FORWARDED_HOST': baseHostForwarded
})
.next(function(response) {
assertBaseHost(baseHostByOption, response);
done();
})
.error(function(error) {
done(error);
});
});
});

test('Get, Action=DeleteDomain', function(done) {
var domain;
utils
Expand Down
15 changes: 8 additions & 7 deletions test/test-utils.js
Expand Up @@ -18,13 +18,14 @@ exports.testBaseHost = testBaseHost;
exports.testConfigurationHost = testConfigurationHost;
exports.testPort = testPort;

function setupServer(context) {
var server = gcsServer.createServer({
context: context,
port: testPort,
baseHost: exports.testBaseHost + ':80',
configurationHost: exports.testConfigurationHost + ':80'
});
function setupServer(context, extraOptions) {
var options = { context: context,
port: testPort };
if (extraOptions)
Object.keys(extraOptions).forEach(function(key) {
options[key] = extraOptions[key];
});
var server = gcsServer.createServer(options);
server.listen(testPort);
return server;
}
Expand Down

0 comments on commit 48d7645

Please sign in to comment.