Merge pull request #9773 from Rob--W/content-disposition-textdecode-utf8
Fix multibyte decoding in content_disposition.js
This commit is contained in:
commit
3859c63780
@ -78,24 +78,27 @@ function getFilenameFromContentDispositionHeader(contentDisposition) {
|
|||||||
}
|
}
|
||||||
function textdecode(encoding, value) {
|
function textdecode(encoding, value) {
|
||||||
if (encoding) {
|
if (encoding) {
|
||||||
if (!/^[^\x00-\xFF]+$/.test(value)) {
|
if (!/^[\x00-\xFF]+$/.test(value)) {
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
let decoder = new TextDecoder(encoding, { fatal: true, });
|
let decoder = new TextDecoder(encoding, { fatal: true, });
|
||||||
let bytes = new Array(value.length);
|
let bytes = new Array(value.length);
|
||||||
for (let i = 0; i < value.length; ++i) {
|
for (let i = 0; i < value.length; ++i) {
|
||||||
bytes[i] = value.charCodeAt(0);
|
bytes[i] = value.charCodeAt(i);
|
||||||
}
|
}
|
||||||
value = decoder.decode(new Uint8Array(bytes));
|
value = decoder.decode(new Uint8Array(bytes));
|
||||||
needsEncodingFixup = false;
|
needsEncodingFixup = false;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// TextDecoder constructor threw - unrecognized encoding.
|
// TextDecoder constructor threw - unrecognized encoding.
|
||||||
// Or TextDecoder API is not available.
|
// Or TextDecoder API is not available (in IE / Edge).
|
||||||
if (/^utf-?8$/i.test(encoding)) {
|
if (/^utf-?8$/i.test(encoding)) {
|
||||||
// UTF-8 is commonly used, try to support it in another way:
|
// UTF-8 is commonly used, try to support it in another way:
|
||||||
value = decodeURIComponent(escape(value));
|
try {
|
||||||
needsEncodingFixup = false;
|
value = decodeURIComponent(escape(value));
|
||||||
|
needsEncodingFixup = false;
|
||||||
|
} catch (err) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -104,7 +107,11 @@ function getFilenameFromContentDispositionHeader(contentDisposition) {
|
|||||||
function fixupEncoding(value) {
|
function fixupEncoding(value) {
|
||||||
if (needsEncodingFixup && /[\x80-\xff]/.test(value)) {
|
if (needsEncodingFixup && /[\x80-\xff]/.test(value)) {
|
||||||
// Maybe multi-byte UTF-8.
|
// Maybe multi-byte UTF-8.
|
||||||
return textdecode('utf-8', value);
|
value = textdecode('utf-8', value);
|
||||||
|
if (needsEncodingFixup) {
|
||||||
|
// Try iso-8859-1 encoding.
|
||||||
|
value = textdecode('iso-8859-1', value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
@ -206,10 +213,10 @@ function getFilenameFromContentDispositionHeader(contentDisposition) {
|
|||||||
return textdecode(charset, text);
|
return textdecode(charset, text);
|
||||||
} // else encoding is b or B - base64 (RFC 2047 section 4.1)
|
} // else encoding is b or B - base64 (RFC 2047 section 4.1)
|
||||||
try {
|
try {
|
||||||
return atob(text);
|
text = atob(text);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return text;
|
|
||||||
}
|
}
|
||||||
|
return textdecode(charset, text);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user