如何正确设置和测试Hapi域和子域?

时间:2015-03-18 02:50:30

标签: node.js hapijs

我目前正在更新我为从请求对象解析语言环境所做的small library。它目前适用于Express和Koa,但我正试图让它与Hapi合作。

对于测试,我正在使用他们的文档中描述的Mocha和Hapi的inject方法。我还查看了他们设置服务器properties的文档,但我找不到设置locahost.en等域名甚至是en.localhost.com等子域名的示例。

目前,我的测试设置如下:

var server = new Hapi.Server();
server.connection({
    //is this correct?
    uri:'localhost.en:3000',
    port: 3000
});

var handler = function(request, reply) {
    //return the parsed locale {String}
    return reply(accept(request, {
           supported: ['en']
    }).getFromDomain());
 };

server.route({
    method: 'GET',
    path: '/',
    handler: handler
});
server.start(function() {});

其中inject设置如下:

server.inject({
    method: 'GET',
    url: '/',
    headers: {
        'Accept-Language': 'ja',
        'Set-Cookie': 'mycookie=test'
     }}, function(res) {
        assert.strictEqual(res.result, 'en');
        done();
});

我如何在服务器属性中设置域和子域?是否有插件可以做到这一点?另外,我如何从request获取/解析域和子域?我假设我可以从hostname获取域名,但子域​​名怎么样?

1 个答案:

答案 0 :(得分:11)

默认情况下,Hapi将侦听网络接口上的所有请求,而不管域是什么(由host标头的值指示)。如果要获取请求的主机标头的值,只需检查request.headers.host

如果您只想查看已解析的主机名(域),可以查看request.info.hostname

server.route({
    method: 'GET',
    path: '/',
    handler: function(request, reply) {

        var hostname = request.info.hostname;    

        reply('Ok');
     }
});

如果要限制路径(或插件)允许的主机名,可以设置vhost选项。

server.route({
    method: 'GET',
    path: '/',
    vhost: ['en.example.com'],
    handler: function(request, reply) {

        reply('Ok');
     }
});

要使用server.inject测试不同的虚拟主机,您可以只包含一个显式主机标头

server.inject({
    method: 'GET',
    url: '/',
    headers: {
        'Set-Cookie': 'mycookie=test',
     }}, function(res) {

        Assert(res.statusCode === 404);    // 404 because not en.example.com
});

server.inject({
    method: 'GET',
    url: '/',
    headers: {
        'Set-Cookie': 'mycookie=test',
        'Host': 'en.example.com'
     }}, function(res) {

        Assert(res.statusCode === 200);    // 200 because en.example.com
});