feat: ignore set/remove header/status when header sent (#1145)
This commit is contained in:
parent
494a365427
commit
f04714227b
5 changed files with 46 additions and 0 deletions
|
@ -79,6 +79,8 @@ module.exports = {
|
|||
*/
|
||||
|
||||
set status(code) {
|
||||
if (this.headerSent) return;
|
||||
|
||||
assert('number' == typeof code, 'status code must be a number');
|
||||
assert(statuses[code], 'invalid status code: ' + code);
|
||||
this._explicitStatus = true;
|
||||
|
@ -229,6 +231,8 @@ module.exports = {
|
|||
*/
|
||||
|
||||
vary: function(field){
|
||||
if (this.headerSent) return;
|
||||
|
||||
vary(this.res, field);
|
||||
},
|
||||
|
||||
|
@ -430,6 +434,8 @@ module.exports = {
|
|||
*/
|
||||
|
||||
set: function(field, val){
|
||||
if (this.headerSent) return;
|
||||
|
||||
if (2 == arguments.length) {
|
||||
if (Array.isArray(val)) val = val.map(String);
|
||||
else val = String(val);
|
||||
|
@ -475,6 +481,8 @@ module.exports = {
|
|||
*/
|
||||
|
||||
remove: function(field){
|
||||
if (this.headerSent) return;
|
||||
|
||||
this.res.removeHeader(field);
|
||||
},
|
||||
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
'use strict';
|
||||
|
||||
var context = require('../context');
|
||||
var should = require('should');
|
||||
|
||||
describe('ctx.remove(name)', function(){
|
||||
it('should remove a field', function(){
|
||||
|
@ -10,4 +11,14 @@ describe('ctx.remove(name)', function(){
|
|||
ctx.remove('x-foo');
|
||||
ctx.response.header.should.eql({});
|
||||
})
|
||||
|
||||
describe('after header sent', function(){
|
||||
it('should ignore', function(){
|
||||
var ctx = context();
|
||||
ctx.set('foo', 'bar');
|
||||
ctx.res.headersSent = true;
|
||||
ctx.remove('foo', 'bar');
|
||||
ctx.response.header.foo.should.equal('bar');
|
||||
})
|
||||
})
|
||||
})
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
'use strict';
|
||||
|
||||
var context = require('../context');
|
||||
var should = require('should');
|
||||
|
||||
describe('ctx.set(name, val)', function(){
|
||||
it('should set a field value', function(){
|
||||
|
@ -21,6 +22,14 @@ describe('ctx.set(name, val)', function(){
|
|||
ctx.set('x-foo', ['foo', 'bar']);
|
||||
ctx.response.header['x-foo'].should.eql([ 'foo', 'bar' ]);
|
||||
})
|
||||
|
||||
describe('after header sent', function(){
|
||||
it('should ignore', function(){
|
||||
var ctx = context(null, { headersSent: true });
|
||||
ctx.set('foo', 'bar');
|
||||
should.not.exist(ctx.response.header.foo);
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
describe('ctx.set(object)', function(){
|
||||
|
|
|
@ -5,6 +5,7 @@ var response = require('../context').response;
|
|||
var request = require('supertest');
|
||||
var statuses = require('statuses');
|
||||
var assert = require('assert');
|
||||
var should = require('should');
|
||||
var koa = require('../..');
|
||||
|
||||
describe('res.status=', function(){
|
||||
|
@ -50,6 +51,14 @@ describe('res.status=', function(){
|
|||
})
|
||||
})
|
||||
|
||||
describe('after header sent', function(){
|
||||
it('should ignore', function(){
|
||||
var res = response(null, { headersSent: true });
|
||||
res.status = 200;
|
||||
should.not.exist(res.status);
|
||||
})
|
||||
})
|
||||
|
||||
describe('when a status string', function(){
|
||||
it('should throw', function(){
|
||||
assert.throws(function() {
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
'use strict';
|
||||
|
||||
var context = require('../context');
|
||||
var should = require('should');
|
||||
|
||||
describe('ctx.vary(field)', function(){
|
||||
describe('when Vary is not set', function(){
|
||||
|
@ -31,4 +32,12 @@ describe('ctx.vary(field)', function(){
|
|||
ctx.response.header.vary.should.equal('Accept, Accept-Encoding');
|
||||
})
|
||||
})
|
||||
|
||||
describe('after header sent', function(){
|
||||
it('should ignore', function(){
|
||||
var ctx = context(null, { headersSent: true });
|
||||
ctx.vary('Accept');
|
||||
should.not.exist(ctx.response.header.vary);
|
||||
})
|
||||
})
|
||||
})
|
||||
|
|
Loading…
Reference in a new issue