add pipe example. Closes #9
This commit is contained in:
parent
eb41a90b80
commit
17d8f67073
1 changed files with 74 additions and 0 deletions
74
examples/streams-pipe.js
Normal file
74
examples/streams-pipe.js
Normal file
|
@ -0,0 +1,74 @@
|
|||
|
||||
var zlib = require('zlib');
|
||||
var koa = require('..');
|
||||
var fs = require('fs');
|
||||
var app = koa();
|
||||
|
||||
// ignore favicons
|
||||
|
||||
app.use(function(next){
|
||||
return function *(){
|
||||
if ('/favicon.ico' == this.path) this.status = 404;
|
||||
yield next;
|
||||
}
|
||||
});
|
||||
|
||||
// logger
|
||||
|
||||
app.use(function(next){
|
||||
return function *(){
|
||||
console.log('%s %s', this.method, this.url);
|
||||
yield next;
|
||||
}
|
||||
});
|
||||
|
||||
// stream a file
|
||||
|
||||
app.use(function(next){
|
||||
return function *(){
|
||||
var path = __dirname + this.path;
|
||||
var exists = yield isFile(path);
|
||||
|
||||
if (!exists) return yield next;
|
||||
|
||||
this.body = fs.createReadStream(path);
|
||||
yield next;
|
||||
}
|
||||
});
|
||||
|
||||
// gzip the response
|
||||
|
||||
app.use(function(next){
|
||||
return function *(){
|
||||
if (!this.hasContent) return yield next;
|
||||
|
||||
// TODO: fix ...
|
||||
if (!this.body) return yield next;
|
||||
|
||||
if (this.body.readable) {
|
||||
var body = this.body;
|
||||
var gzip = zlib.createGzip();
|
||||
this.set('Content-Encoding', 'gzip');
|
||||
this.body = gzip;
|
||||
body.pipe(gzip);
|
||||
}
|
||||
|
||||
yield next;
|
||||
}
|
||||
});
|
||||
|
||||
app.listen(3000);
|
||||
|
||||
/**
|
||||
* Stat regular file helper.
|
||||
*/
|
||||
|
||||
function isFile(file) {
|
||||
return function(done){
|
||||
fs.stat(file, function(err, stat){
|
||||
if (err && 'ENOENT' == err.code) return done(null, false);
|
||||
if (err) return done(err);
|
||||
done(null, stat.isFile());
|
||||
});
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue