You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
1.5 KiB
79 lines
1.5 KiB
|
|
/*! |
|
* Connect |
|
* Copyright(c) 2011 TJ Holowaychuk |
|
* MIT Licensed |
|
*/ |
|
|
|
/** |
|
* Module dependencies. |
|
*/ |
|
|
|
var http = require('http') |
|
, res = http.OutgoingMessage.prototype; |
|
|
|
// original setHeader() |
|
|
|
var setHeader = res.setHeader; |
|
|
|
// original _renderHeaders() |
|
|
|
var _renderHeaders = res._renderHeaders; |
|
|
|
if (res._hasConnectPatch) return; |
|
|
|
/** |
|
* Provide a public "header sent" flag |
|
* until node does. |
|
* |
|
* @return {Boolean} |
|
* @api public |
|
*/ |
|
|
|
res.__defineGetter__('headerSent', function(){ |
|
return this._headerSent; |
|
}); |
|
|
|
/** |
|
* Set header `field` to `val`, special-casing |
|
* the `Set-Cookie` field for multiple support. |
|
* |
|
* @param {String} field |
|
* @param {String} val |
|
* @api public |
|
*/ |
|
|
|
res.setHeader = function(field, val){ |
|
var key = field.toLowerCase() |
|
, prev; |
|
|
|
// special-case Set-Cookie |
|
if (this._headers && 'set-cookie' == key) { |
|
if (prev = this.getHeader(field)) { |
|
val = Array.isArray(prev) |
|
? prev.concat(val) |
|
: [prev, val]; |
|
} |
|
// charset |
|
} else if ('content-type' == key && this.charset) { |
|
val += '; charset=' + this.charset; |
|
} |
|
|
|
return setHeader.call(this, field, val); |
|
}; |
|
|
|
/** |
|
* Proxy `res.end()` to expose a 'header' event, |
|
* allowing arbitrary augmentation before the header |
|
* fields are written to the socket. |
|
* |
|
* NOTE: this _only_ supports node's progressive header |
|
* field API aka `res.setHeader()`. |
|
*/ |
|
|
|
res._renderHeaders = function(){ |
|
this.emit('header'); |
|
return _renderHeaders.call(this); |
|
}; |
|
|
|
res._hasConnectPatch = true;
|
|
|