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

How to properly set and test Hapi domain and subdomain?

我目前正在更新我为从请求对象解析区域设置而创建的 small library。它目前可以与 Express 和 Koa 一起使用,但我正在尝试让它与 Hapi 一起使用。

对于测试,我正在使用 Mocha 和 Hapi 的 inject 方法,如他们的文档中所述。我还查看了他们的文档以设置服务器的 properties,但我没有找到设置域(例如 locahost.en 甚至子域(例如 en.localhost.com.[=20)的示例=]

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

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();
});

如何在服务器属性中设置域和子域?有没有这样做的插件?另外,我如何 get/parse 来自 request 的域和子域?我假设我可以从 hostname 获取域,但是子域怎么样?

默认情况下,Hapi 将在网络接口上的端口上侦听所有请求,而不管域(由 host header 的值表示)。如果你想获取请求的主机 header 的值,你可以简单地检查 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 测试不同的虚拟主机,您可以只包含一个显式主机 header

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
});