Merge pull request #9773 from Rob--W/content-disposition-textdecode-utf8

Fix multibyte decoding in content_disposition.js
This commit is contained in:
Tim van der Meij 2018-06-03 19:38:35 +02:00 committed by GitHub
commit 3859c63780
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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);
}); });
} }