response: don't access res._headers directly when helpers exist
res._headers is considered internal to node itself. Its value will change in a backwards incompatible way in the future node releases. Use the documented helper functions instead when they are available.
This commit is contained in:
parent
0b9c8b8078
commit
91c403a541
4 changed files with 40 additions and 3 deletions
|
@ -115,8 +115,14 @@ var proto = module.exports = {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// unset all headers, and set those specified
|
// first unset all headers
|
||||||
this.res._headers = {};
|
if (this.res.getHeaderNames) {
|
||||||
|
this.res.getHeaderNames().forEach(function(name) { this.removeHeader(name) }, this.res);
|
||||||
|
} else {
|
||||||
|
this.res._headers = {}; // Node < 8
|
||||||
|
}
|
||||||
|
|
||||||
|
// then set those specified
|
||||||
this.set(err.headers);
|
this.set(err.headers);
|
||||||
|
|
||||||
// force text/plain
|
// force text/plain
|
||||||
|
|
|
@ -44,7 +44,9 @@ module.exports = {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
get header() {
|
get header() {
|
||||||
return this.res._headers || {};
|
return this.res.getHeaders
|
||||||
|
? this.res.getHeaders()
|
||||||
|
: this.res._headers || {}; // Node < 8
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
var assert = require('assert');
|
||||||
var request = require('supertest');
|
var request = require('supertest');
|
||||||
var koa = require('../..');
|
var koa = require('../..');
|
||||||
|
var context = require('../context');
|
||||||
|
|
||||||
describe('ctx.onerror(err)', function(){
|
describe('ctx.onerror(err)', function(){
|
||||||
it('should respond', function(done){
|
it('should respond', function(done){
|
||||||
|
@ -147,4 +149,21 @@ describe('ctx.onerror(err)', function(){
|
||||||
.expect('Internal Server Error', done);
|
.expect('Internal Server Error', done);
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('should use res.getHeaderNames when available', function(){
|
||||||
|
var removed = 0;
|
||||||
|
var ctx = context();
|
||||||
|
|
||||||
|
ctx.app.emit = function() {};
|
||||||
|
ctx.res = {
|
||||||
|
getHeaderNames: function() { return ['content-type', 'content-length'] },
|
||||||
|
removeHeader: function() { removed++ },
|
||||||
|
end: function() {},
|
||||||
|
emit: function() {}
|
||||||
|
};
|
||||||
|
|
||||||
|
ctx.onerror(new Error('error'));
|
||||||
|
|
||||||
|
assert.equal(removed, 2);
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
|
@ -10,6 +10,16 @@ describe('res.header', function(){
|
||||||
res.header.should.eql({ 'x-foo': 'bar' });
|
res.header.should.eql({ 'x-foo': 'bar' });
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('should use res.getHeaders helper when it is available', function(){
|
||||||
|
var res = response(null, {
|
||||||
|
_headers: {},
|
||||||
|
getHeaders: function(){
|
||||||
|
return { 'x-foo': 'baz' }
|
||||||
|
}
|
||||||
|
});
|
||||||
|
res.header.should.eql({ 'x-foo': 'baz' });
|
||||||
|
})
|
||||||
|
|
||||||
describe('when res._headers not present', function (){
|
describe('when res._headers not present', function (){
|
||||||
it('should return empty object', function (){
|
it('should return empty object', function (){
|
||||||
var res = response();
|
var res = response();
|
||||||
|
|
Loading…
Reference in a new issue