Определить что в теле http ответа текст

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by GhostOnline, 18 Apr 2011.

  1. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Значит есть ответ от HTTP-сервера ответ, заголовки+тело.
    Надо как-то определить что тело ответа имеет текстовый формат(html, json, xml - в общем любой текст), а не двоичные данные, картинки и т.п.
    Сначала хотел просто проверять поле Content-Type на наличие подстроки "text" или даже "charset", но например application/json и application/xhtml+xml тоже имеют текстовый формат.
    Так как быть то?
     
  2. seosimf

    seosimf Member

    Joined:
    3 Mar 2011
    Messages:
    271
    Likes Received:
    44
    Reputations:
    6
    Ну так составь MIME-Types список текстовых форматов и сверяй, как вариант проверяй на вхождения непечатных символов(кроме символов табуляции, перевода строки и тп), конечно тут придется еще с кодировками разобраться.
     
    1 person likes this.
  3. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Думал над этим, но это геморно из-за того что их слишком много, и отсутствия четкой стандартизации(для одного json'a только 4 типа записи)
    было бы довольно просто если бы я знал что используется ASCII, но это
    все портит :(

    Вопрос можно обобщить: есть буфер/массив байтов/поток данных/etc как распознать что там хранится текст, хотя бы для самых распространенных кодировок
     
  4. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    В общем остановился на след. алгоритме:
    сначала проверяю как писал выше на text
    потом на самые распространенные Content-Type (отберу штук 10-15)
    если результата нет, то проверяю первые N байтов.
    Если процент вхождений байтов таких что (b < 32 && b != 0 && b != 9 && b != 10 && b != 13) выше 8-10
    то скорее всего это не текст. (проверял на множестве файлов как правило от 10% и выше)
    т.е. тут нормальное статистическое распределение, что и подтвердилось экспериментами

    Если будут еще мысли то welcome
     
  5. Jingo Bo

    Jingo Bo Member

    Joined:
    25 Oct 2009
    Messages:
    368
    Likes Received:
    51
    Reputations:
    7
    GhostOnline, ну вообще в конфиге апача(или PHP) записано большая часть MIME типов, половина закомментированна, вот от туда можно взять список.
     
    1 person likes this.