UNPKG

1.6 kBJavaScriptView Raw
1
2/*!
3 * Connect
4 * Copyright(c) 2011 TJ Holowaychuk
5 * MIT Licensed
6 */
7
8/**
9 * Module dependencies.
10 */
11
12var http = require('http')
13 , res = http.ServerResponse.prototype
14 , setHeader = res.setHeader
15 , _renderHeaders = res._renderHeaders
16 , writeHead = res.writeHead;
17
18// apply only once
19
20if (!res._hasConnectPatch) {
21
22 /**
23 * Provide a public "header sent" flag
24 * until node does.
25 *
26 * @return {Boolean}
27 * @api public
28 */
29
30 res.__defineGetter__('headerSent', function(){
31 return this._header;
32 });
33
34 /**
35 * Set header `field` to `val`, special-casing
36 * the `Set-Cookie` field for multiple support.
37 *
38 * @param {String} field
39 * @param {String} val
40 * @api public
41 */
42
43 res.setHeader = function(field, val){
44 var key = field.toLowerCase()
45 , prev;
46
47 // special-case Set-Cookie
48 if (this._headers && 'set-cookie' == key) {
49 if (prev = this.getHeader(field)) {
50 val = Array.isArray(prev)
51 ? prev.concat(val)
52 : [prev, val];
53 }
54 // charset
55 } else if ('content-type' == key && this.charset) {
56 val += '; charset=' + this.charset;
57 }
58
59 return setHeader.call(this, field, val);
60 };
61
62 /**
63 * Proxy to emit "header" event.
64 */
65
66 res._renderHeaders = function(){
67 if (!this._emittedHeader) this.emit('header');
68 this._emittedHeader = true;
69 return _renderHeaders.call(this);
70 };
71
72 res.writeHead = function(){
73 if (!this._emittedHeader) this.emit('header');
74 this._emittedHeader = true;
75 return writeHead.apply(this, arguments);
76 };
77
78 res._hasConnectPatch = true;
79}