UNPKG

1.51 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.OutgoingMessage.prototype;
14
15// original setHeader()
16
17var setHeader = res.setHeader;
18
19// original _renderHeaders()
20
21var _renderHeaders = res._renderHeaders;
22
23if (res._hasConnectPatch) return;
24
25/**
26 * Provide a public "header sent" flag
27 * until node does.
28 *
29 * @return {Boolean}
30 * @api public
31 */
32
33res.__defineGetter__('headerSent', function(){
34 return this._headerSent;
35});
36
37/**
38 * Set header `field` to `val`, special-casing
39 * the `Set-Cookie` field for multiple support.
40 *
41 * @param {String} field
42 * @param {String} val
43 * @api public
44 */
45
46res.setHeader = function(field, val){
47 var key = field.toLowerCase()
48 , prev;
49
50 // special-case Set-Cookie
51 if (this._headers && 'set-cookie' == key) {
52 if (prev = this.getHeader(field)) {
53 val = Array.isArray(prev)
54 ? prev.concat(val)
55 : [prev, val];
56 }
57 // charset
58 } else if ('content-type' == key && this.charset) {
59 val += '; charset=' + this.charset;
60 }
61
62 return setHeader.call(this, field, val);
63};
64
65/**
66 * Proxy `res.end()` to expose a 'header' event,
67 * allowing arbitrary augmentation before the header
68 * fields are written to the socket.
69 *
70 * NOTE: this _only_ supports node's progressive header
71 * field API aka `res.setHeader()`.
72 */
73
74res._renderHeaders = function(){
75 this.emit('header');
76 return _renderHeaders.call(this);
77};
78
79res._hasConnectPatch = true;