Skip to content

Commit 6f31218

Browse files
committed
Use content-disposition module
1 parent 6cd4859 commit 6f31218

File tree

5 files changed

+17
-19
lines changed

5 files changed

+17
-19
lines changed

History.md

+3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
unreleased
22
==========
33

4+
* Use `content-disposition` module for `res.attachment`/`res.download`
5+
- Sends standards-compliant `Content-Disposition` header
6+
- Full Unicode support
47
* deps: etag@~1.5.0
58
- Improve string performance
69
- Slightly improve speed for weak ETags over 1KB

lib/response.js

+7-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
* Module dependencies.
33
*/
44

5+
var contentDisposition = require('content-disposition');
56
var deprecate = require('depd')('express');
67
var escapeHtml = require('escape-html');
78
var http = require('http');
@@ -13,7 +14,6 @@ var sign = require('cookie-signature').sign;
1314
var normalizeType = require('./utils').normalizeType;
1415
var normalizeTypes = require('./utils').normalizeTypes;
1516
var setCharset = require('./utils').setCharset;
16-
var contentDisposition = require('./utils').contentDisposition;
1717
var statusCodes = http.STATUS_CODES;
1818
var cookie = require('cookie');
1919
var send = require('send');
@@ -626,9 +626,13 @@ res.format = function(obj){
626626
* @api public
627627
*/
628628

629-
res.attachment = function(filename){
630-
if (filename) this.type(extname(filename));
629+
res.attachment = function attachment(filename) {
630+
if (filename) {
631+
this.type(extname(filename));
632+
}
633+
631634
this.set('Content-Disposition', contentDisposition(filename));
635+
632636
return this;
633637
};
634638

lib/utils.js

+4-12
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
* Module dependencies.
33
*/
44

5+
var contentDisposition = require('content-disposition');
6+
var deprecate = require('depd')('express');
57
var mime = require('send').mime;
68
var basename = require('path').basename;
79
var etag = require('etag');
@@ -120,18 +122,8 @@ exports.normalizeTypes = function(types){
120122
* @api private
121123
*/
122124

123-
exports.contentDisposition = function(filename){
124-
var ret = 'attachment';
125-
if (filename) {
126-
filename = basename(filename);
127-
// if filename contains non-ascii characters, add a utf-8 version ala RFC 5987
128-
ret = /[^\040-\176]/.test(filename)
129-
? 'attachment; filename="' + encodeURI(filename) + '"; filename*=UTF-8\'\'' + encodeURI(filename)
130-
: 'attachment; filename="' + filename + '"';
131-
}
132-
133-
return ret;
134-
};
125+
exports.contentDisposition = deprecate.function(contentDisposition,
126+
'utils.contentDisposition: use content-disposition npm module instead');
135127

136128
/**
137129
* Parse accept params `str` returning an

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
"homepage": "http://expressjs.com/",
2929
"dependencies": {
3030
"accepts": "~1.1.2",
31+
"content-disposition": "0.5.0",
3132
"cookie-signature": "1.0.5",
3233
"debug": "~2.0.0",
3334
"depd": "0.4.5",

test/res.attachment.js

+2-4
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,8 @@ describe('res', function(){
5656

5757
request(app)
5858
.get('/')
59-
.expect('Content-Disposition', 'attachment;' +
60-
' filename="%E6%97%A5%E6%9C%AC%E8%AA%9E.txt";' +
61-
' filename*=UTF-8\'\'%E6%97%A5%E6%9C%AC%E8%AA%9E.txt',
62-
done);
59+
.expect('Content-Disposition', 'attachment; filename="???.txt"; filename*=UTF-8\'\'%E6%97%A5%E6%9C%AC%E8%AA%9E.txt')
60+
.expect(200, done);
6361
})
6462

6563
it('should set the Content-Type', function(done){

0 commit comments

Comments
 (0)