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