Skip to content

Commit 505d056

Browse files
gtorsshockey
authored andcommitted
improve: add support of RFC5987 Content-Disposition formats (via #4952)
* Add support of RFC5987 for Content-Disposition For example, `attachement; filename*=UTF-8'ru'%D1%81%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F.xlsx` in result will be `сведения.xlsx`. * Test of support of RFC5987 in Content-Disposition
1 parent 9a4dd00 commit 505d056

File tree

2 files changed

+32
-6
lines changed

2 files changed

+32
-6
lines changed

src/core/utils.js

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -343,13 +343,27 @@ export function mapToList(map, keyNames="key", collectedKeys=Im.Map()) {
343343
}
344344

345345
export function extractFileNameFromContentDispositionHeader(value){
346-
let responseFilename = /filename="([^;]*);?"/i.exec(value)
347-
if (responseFilename === null) {
348-
responseFilename = /filename=([^;]*);?/i.exec(value)
349-
}
346+
let patterns = [
347+
/filename\*=[^']+'\w*'"([^"]+)";?/i,
348+
/filename\*=[^']+'\w*'([^;]+);?/i,
349+
/filename="([^;]*);?"/i,
350+
/filename=([^;]*);?/i
351+
]
352+
353+
let responseFilename
354+
patterns.some(regex => {
355+
responseFilename = regex.exec(value)
356+
return responseFilename !== null
357+
})
358+
350359
if (responseFilename !== null && responseFilename.length > 1) {
351-
return responseFilename[1]
360+
try {
361+
return decodeURIComponent(responseFilename[1])
362+
} catch(e) {
363+
console.error(e)
364+
}
352365
}
366+
353367
return null
354368
}
355369

@@ -790,4 +804,4 @@ export function numberToString(thing) {
790804
}
791805

792806
return thing
793-
}
807+
}

test/core/utils.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,18 @@ describe("utils", function() {
109109
let expectedResult = "filename.jpg"
110110
expect(extractFileNameFromContentDispositionHeader(cdHeader)).toEqual(expectedResult)
111111
})
112+
113+
it("should extract quoted filename in utf-8", function(){
114+
let cdHeader = "attachment; filename*=UTF-8''\"%D1%84%D0%B0%D0%B9%D0%BB.txt\""
115+
let expectedResult = "файл.txt"
116+
expect(extractFileNameFromContentDispositionHeader(cdHeader)).toEqual(expectedResult)
117+
})
118+
119+
it("should extract filename in utf-8", function(){
120+
let cdHeader = "attachment; filename*=utf-8'ru'%D1%84%D0%B0%D0%B9%D0%BB.txt"
121+
let expectedResult = "файл.txt"
122+
expect(extractFileNameFromContentDispositionHeader(cdHeader)).toEqual(expectedResult)
123+
})
112124

113125
it("should not extract filename and return null", function(){
114126
let cdHeader = "attachment; no file name provided"

0 commit comments

Comments
 (0)