root / HServer / 00.Server / 00.Program / node_modules / on-headers / index.js
이력 | 보기 | 이력해설 | 다운로드 (2.02 KB)
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 |
} |