simplify respond
This commit is contained in:
parent
a95046278f
commit
b06bb3cb85
2 changed files with 44 additions and 18 deletions
|
@ -5,6 +5,7 @@
|
||||||
var debug = require('debug')('koa:application');
|
var debug = require('debug')('koa:application');
|
||||||
var onFinished = require('finished');
|
var onFinished = require('finished');
|
||||||
var Emitter = require('events').EventEmitter;
|
var Emitter = require('events').EventEmitter;
|
||||||
|
var Stream = require('stream');
|
||||||
var compose = require('koa-compose');
|
var compose = require('koa-compose');
|
||||||
var context = require('./context');
|
var context = require('./context');
|
||||||
var request = require('./request');
|
var request = require('./request');
|
||||||
|
@ -174,7 +175,6 @@ function *respond(next) {
|
||||||
|
|
||||||
var body = this.body;
|
var body = this.body;
|
||||||
var code = this.status = this.status || 404;
|
var code = this.status = this.status || 404;
|
||||||
var head = 'HEAD' == this.method;
|
|
||||||
|
|
||||||
// ignore body
|
// ignore body
|
||||||
if (status.empty[code]) {
|
if (status.empty[code]) {
|
||||||
|
@ -183,10 +183,12 @@ function *respond(next) {
|
||||||
return res.end();
|
return res.end();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (null == body) {
|
if ('HEAD' == this.method) {
|
||||||
// empty body
|
if (isJSON(body)) this.length = Buffer.byteLength(JSON.stringify(body));
|
||||||
if (head) return res.end();
|
return res.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (null == body) {
|
||||||
// status body
|
// status body
|
||||||
this.type = 'text';
|
this.type = 'text';
|
||||||
body = status[code];
|
body = status[code];
|
||||||
|
@ -195,27 +197,29 @@ function *respond(next) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Buffer body
|
// Buffer body
|
||||||
if (Buffer.isBuffer(body)) {
|
if (Buffer.isBuffer(body)) return res.end(body);
|
||||||
if (head) return res.end();
|
|
||||||
return res.end(body);
|
|
||||||
}
|
|
||||||
|
|
||||||
// string body
|
// string body
|
||||||
if ('string' == typeof body) {
|
if ('string' == typeof body) return res.end(body);
|
||||||
if (head) return res.end();
|
|
||||||
return res.end(body);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Stream body
|
// Stream body
|
||||||
if ('function' == typeof body.pipe) {
|
if (body instanceof Stream) return body.pipe(res);
|
||||||
if (head) return res.end();
|
|
||||||
|
|
||||||
return body.pipe(res);
|
|
||||||
}
|
|
||||||
|
|
||||||
// body: json
|
// body: json
|
||||||
body = JSON.stringify(body);
|
body = JSON.stringify(body);
|
||||||
this.length = Buffer.byteLength(body);
|
this.length = Buffer.byteLength(body);
|
||||||
if (head) return res.end();
|
|
||||||
res.end(body);
|
res.end(body);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if `body` should be interpreted as json.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
function isJSON(body) {
|
||||||
|
if (!body) return false;
|
||||||
|
if ('string' == typeof body) return false;
|
||||||
|
if (body instanceof Stream) return false;
|
||||||
|
if (Buffer.isBuffer(body)) return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
|
@ -156,12 +156,34 @@ describe('app.respond', function(){
|
||||||
.expect(200)
|
.expect(200)
|
||||||
.end(function(err, res){
|
.end(function(err, res){
|
||||||
if (err) return done(err);
|
if (err) return done(err);
|
||||||
|
res.should.have.header('Content-Type', 'text/plain; charset=utf-8');
|
||||||
res.should.have.header('Content-Length', '5');
|
res.should.have.header('Content-Length', '5');
|
||||||
assert(0 == res.text.length);
|
assert(0 == res.text.length);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('should keep the headers', function(done){
|
||||||
|
var app = koa();
|
||||||
|
|
||||||
|
app.use(function *(){
|
||||||
|
this.body = { hello: 'world' };
|
||||||
|
});
|
||||||
|
|
||||||
|
var server = app.listen();
|
||||||
|
|
||||||
|
request(server)
|
||||||
|
.head('/')
|
||||||
|
.expect(200)
|
||||||
|
.end(function(err, res){
|
||||||
|
if (err) return done(err);
|
||||||
|
res.should.have.header('Content-Type', 'application/json');
|
||||||
|
res.should.have.header('Content-Length', '17');
|
||||||
|
assert(0 == res.text.length);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
})
|
||||||
|
|
||||||
it('should respond with a 404 if no body was set', function(done){
|
it('should respond with a 404 if no body was set', function(done){
|
||||||
var app = koa();
|
var app = koa();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue