Bug:Fix file validation issue
[vnfsdk/refrepo.git] / vnfmarket / src / main / webapp / vnfmarket / node_modules / on-headers / index.js
1 /*!
2  * on-headers
3  * Copyright(c) 2014 Douglas Christopher Wilson
4  * MIT Licensed
5  */
6
7 'use strict'
8
9 /**
10  * Reference to Array slice.
11  */
12
13 var slice = Array.prototype.slice
14
15 /**
16  * Execute a listener when a response is about to write headers.
17  *
18  * @param {Object} res
19  * @return {Function} listener
20  * @api public
21  */
22
23 module.exports = function onHeaders(res, listener) {
24   if (!res) {
25     throw new TypeError('argument res is required')
26   }
27
28   if (typeof listener !== 'function') {
29     throw new TypeError('argument listener must be a function')
30   }
31
32   res.writeHead = createWriteHead(res.writeHead, listener)
33 }
34
35 function createWriteHead(prevWriteHead, listener) {
36   var fired = false;
37
38   // return function with core name and argument list
39   return function writeHead(statusCode) {
40     // set headers from arguments
41     var args = setWriteHeadHeaders.apply(this, arguments);
42
43     // fire listener
44     if (!fired) {
45       fired = true
46       listener.call(this)
47
48       // pass-along an updated status code
49       if (typeof args[0] === 'number' && this.statusCode !== args[0]) {
50         args[0] = this.statusCode
51         args.length = 1
52       }
53     }
54
55     prevWriteHead.apply(this, args);
56   }
57 }
58
59 function setWriteHeadHeaders(statusCode) {
60   var length = arguments.length
61   var headerIndex = length > 1 && typeof arguments[1] === 'string'
62     ? 2
63     : 1
64
65   var headers = length >= headerIndex + 1
66     ? arguments[headerIndex]
67     : undefined
68
69   this.statusCode = statusCode
70
71   // the following block is from node.js core
72   if (Array.isArray(headers)) {
73     // handle array case
74     for (var i = 0, len = headers.length; i < len; ++i) {
75       this.setHeader(headers[i][0], headers[i][1])
76     }
77   } else if (headers) {
78     // handle object case
79     var keys = Object.keys(headers)
80     for (var i = 0; i < keys.length; i++) {
81       var k = keys[i]
82       if (k) this.setHeader(k, headers[k])
83     }
84   }
85
86   // copy leading arguments
87   var args = new Array(Math.min(length, headerIndex))
88   for (var i = 0; i < args.length; i++) {
89     args[i] = arguments[i]
90   }
91
92   return args
93 }