all files / swagger-node-runner/lib/ hapi_middleware.js

100% Statements 38/38
91.67% Branches 11/12
100% Functions 12/12
100% Lines 36/36
1 statement, 1 function Ignored     
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75                      33× 33×   33× 20×   20×                         33×   12×     53× 53×     32× 32× 32× 31× 53×         20×          
'use strict';
 
module.exports = init;
 
var debug = require('debug')('swagger:hapi_middleware');
 
function init(runner) {
  return new Hapi(runner);
}
 
function Hapi(runner) {
  this.runner = runner;
  this.config = runner.config;
 
  var connectMiddleware = runner.connectMiddleware();
  var chain = connectMiddleware.middleware();
 
  this.plugin = {
    register: function(server, options, next) {
 
      server.ext('onRequest', function(request, reply) {
 
        var req = request.raw.req;
        var res = newResponse(reply);
 
        chain(req, res, function(err) {
          if (err) {
            if (err.statusCode) { res.statusCode = err.statusCode; }
            res.end(err.message);
          }
          res.finish();
        });
      });
 
      /* istanbul ignore next */
      server.on('request-error', function (request, err) {
        debug('Request: %s error: %s', request.id, err.stack);
      });
 
      next();
    }
  };
  this.plugin.register.attributes = { name: 'swagger-node-runner', version: version() };
}
 
function version() {
  return require('../package.json').version;
}
 
function newResponse(reply) {
  return {
    getHeader: function getHeader(name) {
      return this.headers ? this.headers[name.toLowerCase()] : null;
    },
    setHeader: function setHeader(name, value) {
      if (!this.headers) { this.headers = {}; }
      this.headers[name.toLowerCase()] = value;
    },
    end: function end(string) {
      this.res = reply(string);
      this.res.statusCode = this.statusCode;
      if (this.headers) {
        for (var header in this.headers) {
          this.res.header(header, this.headers[header]);
        }
      }
    },
    finish: function finish() {
      if (!this.res) {
        reply.continue();
      }
    }
  };
}