Permalink
Browse files

Describe atEnd, and actually do something with any pending stuff we h…

…ad saved but did not have a `\r\n` to complete it
  • Loading branch information...
1 parent 3f558c4 commit 4fbd362585fc96db2390941c91164bd560f2eeb8 @aredridel committed Oct 24, 2015
Showing with 18 additions and 0 deletions.
  1. +18 −0 index.js
View
@@ -124,6 +124,24 @@ module.exports = {
this.push(data) // Just pass it on. for now.
next(); // Ready for next chunk.
+ }, function atEnd(next) {
+ // through2 takes 2 functions: forEachChunk and atEnd -- this is the second one,
+ // it gets called when the data incoming to through2 ends. Any clean-up or final
+ // actions we need to take before we stop getting called happen here.
+
+ // there's still a stream 'end' event that has to happen, after this stream will
+ // do no more. We don't want a race between our cleanup and the caller's last read
+ // or the end event. They may assume they got it all if end was emitted before this,
+ // but we had one more thing to do, so we have to tell through2 we're not just done,
+ // but done-done.
+ //
+ // If we had no atEnd, it would just send 'end' when we're done. But we had one thing
+ // pending.
+
+ // So if we had leftovers, let's put them in headers. This isn't correct, but
+ // vanishing data in a closure variable is no good either.
+ response.rawHeaders.push(partial);
+ next();
})).pipe(response);
// Whatever comes out of our header-splitting stream parser must be the
// body. Because that's what we designed, right?

0 comments on commit 4fbd362

Please sign in to comment.