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:
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user