Я пишу код для чтения произвольных веб-ресурсов через HTTP / HTTPS в среде Node.js, и я хотел бы вернуть содержимое в виде строки, когда это текстовые данные, и в виде буфера, когда это двоичные данные.
Очевидно, что все, что начинается с text
, например text/html
, является текстовыми данными, которые лучше всего возвращать в виде строки & mdash; конечно, используя соответствующую кодировку символов, которая может быть определена явно (например, text/html; charset=utf-8
), а может и не быть. Кроме того, любое явное определение charset
будет означать, что содержимое является текстовым, а не двоичным, независимо от типа MIME.
Насколько я могу судить, почти все остальное - двоичные данные. Все аудио и видео форматы, которые я знаю, являются двоичными, и почти каждый тип изображения, за исключением image/svg+xml
. Кажется, что большинство типов application/...
являются двоичными, но с некоторыми известными общими исключениями, такими как application/json
.
Кажется ли, что следующая функция адекватно определяет проблему? Если нет, то какие заметные исключения я мог бы пропустить?
function isBinary(contentType: string): boolean {
let $: string[];
if (/;\s*charset\s*=/i.test(contentType))
return false;
// Remove anything other than MIME type.
contentType = contentType.replace(/;.*$/, '').trim();
if (/^text\//i.test(contentType) || /\+xml$/i.test(contentType))
return false;
else if (($ = /^application\/(.+)/i.exec(contentType)))
return !/^(javascript|ecmascript|json|ld\+json|rtf)$/i.test($[1]);
else
return true;
}