我目前正在更新我为从请求对象解析语言环境所做的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
获取域名,但子域名怎么样?
答案 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
});