diff --git a/lib/request.js b/lib/request.js index c8c65a7..8797fbe 100644 --- a/lib/request.js +++ b/lib/request.js @@ -449,7 +449,8 @@ module.exports = { if (!Array.isArray(charsets)) charsets = [].slice.call(arguments); var n = new Negotiator(this.req); if (!charsets.length) return n.preferredCharsets(); - return n.preferredCharsets(charsets)[0]; + if (!this.header['accept-charset']) return charsets[0]; + return n.preferredCharsets(charsets)[0] || false; }, /** diff --git a/test/request/acceptsCharsets.js b/test/request/acceptsCharsets.js index ec51b04..2185d4a 100644 --- a/test/request/acceptsCharsets.js +++ b/test/request/acceptsCharsets.js @@ -20,10 +20,29 @@ describe('ctx.acceptsCharsets()', function(){ }) describe('with multiple arguments', function(){ - it('should return the best fit', function(){ - var ctx = context(); - ctx.req.headers['accept-charset'] = 'utf-8, iso-8859-1;q=0.2, utf-7;q=0.5'; - ctx.acceptsCharsets('utf-7', 'utf-8').should.equal('utf-8'); + describe('when Accept-Charset is populated', function(){ + describe('if any types match', function(){ + it('should return the best fit', function(){ + var ctx = context(); + ctx.req.headers['accept-charset'] = 'utf-8, iso-8859-1;q=0.2, utf-7;q=0.5'; + ctx.acceptsCharsets('utf-7', 'utf-8').should.equal('utf-8'); + }) + }) + + describe('if no types match', function(){ + it('should return false', function(){ + var ctx = context(); + ctx.req.headers['accept-charset'] = 'utf-8, iso-8859-1;q=0.2, utf-7;q=0.5'; + ctx.acceptsCharsets('utf-16').should.be.false; + }) + }) + }) + + describe('when Accept-Charset is not populated', function(){ + it('should return the first type', function(){ + var ctx = context(); + ctx.acceptsCharsets('utf-7', 'utf-8').should.equal('utf-7'); + }) }) })