Определение двоичных данных и текста с использованием заголовка HTTP Content-Type - PullRequest
0 голосов
/ 18 июня 2019

Я пишу код для чтения произвольных веб-ресурсов через 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;
}
...