Bug:Fix file validation issue
[vnfsdk/refrepo.git] / vnfmarket / src / main / webapp / vnfmarket / node_modules / finalhandler / index.js
1 /*!
2  * finalhandler
3  * Copyright(c) 2014-2015 Douglas Christopher Wilson
4  * MIT Licensed
5  */
6
7 'use strict'
8
9 /**
10  * Module dependencies.
11  * @private
12  */
13
14 var debug = require('debug')('finalhandler')
15 var escapeHtml = require('escape-html')
16 var http = require('http')
17 var onFinished = require('on-finished')
18 var unpipe = require('unpipe')
19
20 /**
21  * Module variables.
22  * @private
23  */
24
25 /* istanbul ignore next */
26 var defer = typeof setImmediate === 'function'
27   ? setImmediate
28   : function(fn){ process.nextTick(fn.bind.apply(fn, arguments)) }
29 var isFinished = onFinished.isFinished
30
31 /**
32  * Module exports.
33  * @public
34  */
35
36 module.exports = finalhandler
37
38 /**
39  * Create a function to handle the final response.
40  *
41  * @param {Request} req
42  * @param {Response} res
43  * @param {Object} [options]
44  * @return {Function}
45  * @public
46  */
47
48 function finalhandler(req, res, options) {
49   var opts = options || {}
50
51   // get environment
52   var env = opts.env || process.env.NODE_ENV || 'development'
53
54   // get error callback
55   var onerror = opts.onerror
56
57   return function (err) {
58     var status = res.statusCode
59
60     // ignore 404 on in-flight response
61     if (!err && res._header) {
62       debug('cannot 404 after headers sent')
63       return
64     }
65
66     // unhandled error
67     if (err) {
68       // respect err.statusCode
69       if (err.statusCode) {
70         status = err.statusCode
71       }
72
73       // respect err.status
74       if (err.status) {
75         status = err.status
76       }
77
78       // default status code to 500
79       if (!status || status < 400) {
80         status = 500
81       }
82
83       // production gets a basic error message
84       var msg = env === 'production'
85         ? http.STATUS_CODES[status]
86         : err.stack || err.toString()
87       msg = escapeHtml(msg)
88         .replace(/\n/g, '<br>')
89         .replace(/  /g, ' &nbsp;') + '\n'
90     } else {
91       status = 404
92       msg = 'Cannot ' + escapeHtml(req.method) + ' ' + escapeHtml(req.originalUrl || req.url) + '\n'
93     }
94
95     debug('default %s', status)
96
97     // schedule onerror callback
98     if (err && onerror) {
99       defer(onerror, err, req, res)
100     }
101
102     // cannot actually respond
103     if (res._header) {
104       return req.socket.destroy()
105     }
106
107     send(req, res, status, msg)
108   }
109 }
110
111 /**
112  * Send response.
113  *
114  * @param {IncomingMessage} req
115  * @param {OutgoingMessage} res
116  * @param {number} status
117  * @param {string} body
118  * @private
119  */
120
121 function send(req, res, status, body) {
122   function write() {
123     res.statusCode = status
124
125     // security header for content sniffing
126     res.setHeader('X-Content-Type-Options', 'nosniff')
127
128     // standard headers
129     res.setHeader('Content-Type', 'text/html; charset=utf-8')
130     res.setHeader('Content-Length', Buffer.byteLength(body, 'utf8'))
131
132     if (req.method === 'HEAD') {
133       res.end()
134       return
135     }
136
137     res.end(body, 'utf8')
138   }
139
140   if (isFinished(req)) {
141     write()
142     return
143   }
144
145   // unpipe everything from the request
146   unpipe(req)
147
148   // flush the request
149   onFinished(req, write)
150   req.resume()
151 }