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
This commit is contained in:
Andrey Torsunov
2018-10-19 19:42:37 +03:00
committed by kyle
parent 9a4dd00803
commit 505d056c71
2 changed files with 32 additions and 6 deletions

View File

@@ -343,13 +343,27 @@ export function mapToList(map, keyNames="key", collectedKeys=Im.Map()) {
}
export function extractFileNameFromContentDispositionHeader(value){
let responseFilename = /filename="([^;]*);?"/i.exec(value)
if (responseFilename === null) {
responseFilename = /filename=([^;]*);?/i.exec(value)
}
let patterns = [
/filename\*=[^']+'\w*'"([^"]+)";?/i,
/filename\*=[^']+'\w*'([^;]+);?/i,
/filename="([^;]*);?"/i,
/filename=([^;]*);?/i
]
let responseFilename
patterns.some(regex => {
responseFilename = regex.exec(value)
return responseFilename !== null
})
if (responseFilename !== null && responseFilename.length > 1) {
return responseFilename[1]
try {
return decodeURIComponent(responseFilename[1])
} catch(e) {
console.error(e)
}
}
return null
}

View File

@@ -110,6 +110,18 @@ describe("utils", function() {
expect(extractFileNameFromContentDispositionHeader(cdHeader)).toEqual(expectedResult)
})
it("should extract quoted filename in utf-8", function(){
let cdHeader = "attachment; filename*=UTF-8''\"%D1%84%D0%B0%D0%B9%D0%BB.txt\""
let expectedResult = "файл.txt"
expect(extractFileNameFromContentDispositionHeader(cdHeader)).toEqual(expectedResult)
})
it("should extract filename in utf-8", function(){
let cdHeader = "attachment; filename*=utf-8'ru'%D1%84%D0%B0%D0%B9%D0%BB.txt"
let expectedResult = "файл.txt"
expect(extractFileNameFromContentDispositionHeader(cdHeader)).toEqual(expectedResult)
})
it("should not extract filename and return null", function(){
let cdHeader = "attachment; no file name provided"
let expectedResult = null