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){
|
export function extractFileNameFromContentDispositionHeader(value){
|
||||||
let responseFilename = /filename="([^;]*);?"/i.exec(value)
|
let patterns = [
|
||||||
if (responseFilename === null) {
|
/filename\*=[^']+'\w*'"([^"]+)";?/i,
|
||||||
responseFilename = /filename=([^;]*);?/i.exec(value)
|
/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) {
|
if (responseFilename !== null && responseFilename.length > 1) {
|
||||||
return responseFilename[1]
|
try {
|
||||||
|
return decodeURIComponent(responseFilename[1])
|
||||||
|
} catch(e) {
|
||||||
|
console.error(e)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -790,4 +804,4 @@ export function numberToString(thing) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return thing
|
return thing
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -109,6 +109,18 @@ describe("utils", function() {
|
|||||||
let expectedResult = "filename.jpg"
|
let expectedResult = "filename.jpg"
|
||||||
expect(extractFileNameFromContentDispositionHeader(cdHeader)).toEqual(expectedResult)
|
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(){
|
it("should not extract filename and return null", function(){
|
||||||
let cdHeader = "attachment; no file name provided"
|
let cdHeader = "attachment; no file name provided"
|
||||||
|
|||||||
Reference in New Issue
Block a user