如何正确设置和测试 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
});
我目前正在更新我为从请求对象解析区域设置而创建的 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
});