Skip to content

Commit

Permalink
fix listeners for delayed stream creation
Browse files Browse the repository at this point in the history
fixes #11
fixes #12
  • Loading branch information
dougwilson committed Jun 4, 2014
1 parent 73c50a9 commit c73f1f3
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 7 deletions.
5 changes: 5 additions & 0 deletions HISTORY.md
@@ -1,3 +1,8 @@
unreleased
==========

* fix listeners for delayed stream creation

1.0.4 / 2014-06-03
==================

Expand Down
35 changes: 28 additions & 7 deletions index.js
Expand Up @@ -56,6 +56,7 @@ module.exports = function compression(options) {
}

return function compression(req, res, next){
var listeners = []
var write = res.write
var on = res.on
var end = res.end
Expand Down Expand Up @@ -108,39 +109,47 @@ module.exports = function compression(options) {
};

res.on = function(type, listener){
if (!stream || type !== 'drain') {
if (type !== 'drain') {
return on.call(this, type, listener)
}

return stream.on(type, listener)
if (stream) {
return stream.on(type, listener)
}

// buffer listeners for future stream
listeners.push([type, listener])

return this
}

onHeaders(res, function(){
// default request filter
if (!filter(req, res)) return;
if (!filter(req, res)) return addListeners(res, on, listeners);

// vary
vary(res, 'Accept-Encoding')

if (!compress) return;
if (!compress) return addListeners(res, on, listeners);

var encoding = res.getHeader('Content-Encoding') || 'identity';

// already encoded
if ('identity' != encoding) return;
if ('identity' != encoding) return addListeners(res, on, listeners);

// head
if ('HEAD' == req.method) return;
if ('HEAD' == req.method) return addListeners(res, on, listeners);

// compression method
var accept = accepts(req);
var method = accept.encodings(['gzip', 'deflate', 'identity']);

// negotiation failed
if (!method || method === 'identity') return;
if (!method || method === 'identity') return addListeners(res, on, listeners);

// compression stream
stream = exports.methods[method](options);
addListeners(stream, stream.on, listeners);

// overwrite the flush method
res.flush = function(){
Expand Down Expand Up @@ -171,6 +180,18 @@ module.exports = function compression(options) {
};
};

/**
* Add bufferred listeners to stream
*/

function addListeners(stream, on, listeners) {
var args

while ((args = listeners.shift())) {
on.apply(stream, args)
}
}

function noop(){}

/**
Expand Down

0 comments on commit c73f1f3

Please sign in to comment.