Skip to content

Commit cf61f71

Browse files
committed
basic support for hapi. needs refactoring to remove dup
1 parent 545f1bd commit cf61f71

File tree

9 files changed

+193
-2
lines changed

9 files changed

+193
-2
lines changed

examples/hapi.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
'use strict';
2+
var miniprofiler = require('../lib/miniprofiler.js');
3+
4+
const Hapi = require('hapi');
5+
6+
// Create a server with a host and port
7+
const server = new Hapi.Server();
8+
server.connection({
9+
host: 'localhost',
10+
port: 8080
11+
});
12+
13+
server.register(miniprofiler.hapi(), (err) => {
14+
if (err) console.error('Failed to load plugin:', err);
15+
});
16+
17+
server.route({
18+
method: 'GET',
19+
path:'/hello',
20+
handler: function (request, reply) {
21+
return reply('<html><body>hello' + request.raw.req.miniprofiler.include() + '</body></html>');
22+
}
23+
});
24+
25+
server.start((err) => {
26+
if (err) throw err;
27+
console.log('Server running at:', server.info.uri);
28+
});

lib/middlewares/hapi.js

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
module.exports = function(f, profiler) {
2+
if(!f) f = function() { return true; };
3+
var plugin = {
4+
register: function (server, options, next) {
5+
server.ext('onRequest', function (request, reply) {
6+
7+
profiler.configure();
8+
var enabled = f(request.raw.req, request.raw.res);
9+
10+
request.raw.req.path = request.path;
11+
if(request.path.startsWith(profiler.resourcePath)) {
12+
if (!enabled) {
13+
request.raw.res.setHeader('Content-Type', 'text/plain; charset=utf-8');
14+
request.raw.res.writeHead(404);
15+
request.raw.res.end('MiniProfiler is disabled');
16+
return;
17+
}
18+
19+
var sp = request.path.split('/');
20+
var reqPath = sp[sp.length - 1];
21+
if(reqPath == 'results')
22+
profiler.results(request.raw.req, request.raw.res, (result) => {
23+
request.raw.res.setHeader('Content-Type', result.type);
24+
request.raw.res.writeHead(result.status);
25+
request.raw.res.end(result.body);
26+
});
27+
else
28+
profiler.static(reqPath, request.raw.res, (result) => {
29+
request.raw.res.setHeader('Content-Type', result.type);
30+
request.raw.res.writeHead(result.status);
31+
request.raw.res.end(result.body);
32+
});
33+
return;
34+
}
35+
var id = profiler.startProfiling(request.raw.req, enabled);
36+
37+
//res.locals.miniprofiler = enabled ? req.miniprofiler : {
38+
// include: function() { return ''; }
39+
//};
40+
41+
if (enabled) {
42+
request.raw.res.on('finish', function() {
43+
profiler.stopProfiling(request.raw.req);
44+
});
45+
request.raw.res.setHeader('X-MiniProfiler-Ids', `["${id}"]`);
46+
}
47+
48+
return reply.continue();
49+
50+
});
51+
next();
52+
}
53+
}
54+
55+
plugin.register.attributes = {
56+
name: 'miniprofiler-hapi',
57+
version: require('../../package.json').version
58+
};
59+
60+
return plugin;
61+
};

lib/miniprofiler.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,15 @@ exports.configure = configure;
3737
exports.express = function(f) {
3838
return require('./middlewares/express.js')(f, shared());
3939
};
40+
4041
exports.koa = function(f) {
4142
return require('./middlewares/koa.js')(f, shared());
4243
};
4344

45+
exports.hapi = function(f) {
46+
return require('./middlewares/hapi.js')(f, shared());
47+
};
48+
4449
exports.for = {
4550
pg: require('./providers/miniprofiler.pg.js'),
4651
redis: require('./providers/miniprofiler.redis.js')

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
"coveralls": "^2.11.9",
3030
"eslint": "^2.10.2",
3131
"express": "^4.13.4",
32+
"hapi": "^13.4.1",
3233
"istanbul": "^0.4.3",
3334
"koa": "^1.2.0",
3435
"koa-route": "^2.4.2",

tests/basic-test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ for (var server of servers) {
2323
var result = JSON.parse(body);
2424
expect(result.Id).to.equal(ids[0]);
2525
expect(result.Name).to.equal('/js-sleep');
26-
expect(result.DurationMilliseconds).to.be.above(50);
26+
expect(result.DurationMilliseconds).to.be.above(40);
2727
expect(result.Root.Children).to.be.empty;
2828
expect(result.Root.CustomTimings).to.have.property('custom');
2929
expect(result.Root.CustomTimings.custom).to.have.lengthOf(1);

tests/servers/hapi/default.js

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
'use strict';
2+
var miniprofiler = require('../../../lib/miniprofiler.js');
3+
4+
const Hapi = require('hapi');
5+
6+
const server = new Hapi.Server();
7+
server.connection({
8+
host: 'localhost',
9+
port: 8080
10+
});
11+
12+
server.register(miniprofiler.hapi(), (err) => {
13+
if (err) console.error('Failed to load plugin:', err);
14+
});
15+
16+
server.route({
17+
method: 'GET',
18+
path:'/',
19+
handler: function (request, reply) {
20+
return reply('');
21+
}
22+
});
23+
24+
server.route({
25+
method: 'GET',
26+
path:'/step',
27+
handler: function (request, reply) {
28+
request.raw.req.miniprofiler.step('Step 1', () => {
29+
return reply('');
30+
});
31+
}
32+
});
33+
34+
server.route({
35+
method: 'GET',
36+
path:'/step-two',
37+
handler: function (request, reply) {
38+
request.raw.req.miniprofiler.step('Step 1', () => {
39+
request.raw.req.miniprofiler.step('Step 2', () => {
40+
return reply('');
41+
});
42+
});
43+
}
44+
});
45+
46+
server.route({
47+
method: 'GET',
48+
path:'/js-sleep',
49+
handler: function (request, reply) {
50+
request.raw.req.miniprofiler.timeQuery('custom', 'Sleeping...', setTimeout, function() {
51+
return reply('');
52+
}, 50);
53+
}
54+
});
55+
56+
module.exports = server;

tests/servers/hapi/index.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
var server;
2+
module.exports = {
3+
start: function(name) {
4+
server = require(`./${name}.js`);
5+
server.start((err) => {
6+
if (err) throw err;
7+
});
8+
},
9+
stop: function() {
10+
server.stop();
11+
}
12+
};

tests/servers/hapi/unprofiled.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
'use strict';
2+
var miniprofiler = require('../../../lib/miniprofiler.js');
3+
4+
const Hapi = require('hapi');
5+
6+
const server = new Hapi.Server();
7+
server.connection({
8+
host: 'localhost',
9+
port: 8080
10+
});
11+
12+
var disableMiniProfiler = (req) => {
13+
return false;
14+
};
15+
16+
server.register(miniprofiler.hapi(disableMiniProfiler), (err) => {
17+
if (err) console.error('Failed to load plugin:', err);
18+
});
19+
20+
server.route({
21+
method: 'GET',
22+
path:'/',
23+
handler: function (request, reply) {
24+
return reply('');
25+
}
26+
});
27+
28+
module.exports = server;

tests/servers/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
var request = require('request');
2-
var frameworks = [ 'koa', 'express' ];
2+
var frameworks = [ 'koa', 'express', 'hapi' ];
33
var all = [ ];
44

55
for (var fw of frameworks) {

0 commit comments

Comments
 (0)