diff --git a/lib/response.js b/lib/response.js index 2d96c22..2420b30 100644 --- a/lib/response.js +++ b/lib/response.js @@ -15,6 +15,7 @@ var assert = require('assert'); var http = require('http'); var path = require('path'); var vary = require('vary'); +var contentDisposition = require('content-disposition'); var basename = path.basename; var extname = path.extname; @@ -245,9 +246,7 @@ module.exports = { attachment: function(filename){ if (filename) this.type = extname(filename); - this.set('Content-Disposition', filename - ? 'attachment; filename="' + basename(filename) + '"' - : 'attachment'); + this.set('Content-Disposition', contentDisposition(filename)); }, /** diff --git a/package.json b/package.json index 7d43920..1c8c172 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "media-typer": "~0.3.0", "on-finished": "~2.1.0", "co": "~3.1.0", + "content-disposition": "~0.1.0", "debug": "*", "fresh": "~0.2.1", "koa-compose": "~2.3.0", diff --git a/test/response/attachment.js b/test/response/attachment.js index 5246f4b..f39097f 100644 --- a/test/response/attachment.js +++ b/test/response/attachment.js @@ -1,5 +1,7 @@ +var request = require('supertest'); var context = require('../context'); +var koa = require('../..'); describe('ctx.attachment([filename])', function(){ describe('when given a filename', function(){ @@ -18,4 +20,28 @@ describe('ctx.attachment([filename])', function(){ ctx.response.header['content-disposition'].should.equal('attachment'); }) }) -}) \ No newline at end of file + + describe('when given a no-ascii filename', function(){ + it('should set the encodeURI filename param', function(){ + var ctx = context(); + ctx.attachment('path/to/include-no-ascii-char-中文名-ok.png'); + var str = 'attachment; filename=\"include-no-ascii-char-???-ok.png\"; filename*=UTF-8\'\'include-no-ascii-char-%E4%B8%AD%E6%96%87%E5%90%8D-ok.png'; + ctx.response.header['content-disposition'].should.equal(str); + }) + + it('should work with http client', function(done){ + var app = koa(); + + app.use(function* (next){ + this.attachment('path/to/include-no-ascii-char-中文名-ok.json') + this.body = {foo: 'bar'} + }) + + request(app.listen()) + .get('/') + .expect('content-disposition', 'attachment; filename="include-no-ascii-char-???-ok.json"; filename*=UTF-8\'\'include-no-ascii-char-%E4%B8%AD%E6%96%87%E5%90%8D-ok.json') + .expect({foo: 'bar'}) + .expect(200, done) + }) + }) +})