Jsoup и сжатый HTML-контент (Android) - PullRequest
0 голосов
/ 21 июля 2011

Я целый день пытался заставить эту штуку работать, но она все еще не верна.Я проверил так много постов здесь и протестировал так много разных реализаций, что я не знаю, где искать сейчас ...

Вот моя ситуация, у меня есть небольшой тестовый файл php (gz.php)на моем сервере, который выглядит следующим образом:

header("Content-Encoding: gzip");
print("\x1f\x8b\x08\x00\x00\x00\x00\x00");
$contents = gzcompress("Is it working?", 9);
print($contents);

Это самое простое, что я мог сделать, и он отлично работает с любым веб-браузером.

Теперь у меня есть активность Android с использованием Jsoup, которая имеет этоcode:

URL url = new URL("http://myServerAdress.com/gz.php");
doc = Jsoup.parse(url, 1000);

, которые вызывают пустое исключение EOFException в строке "Jsoup.parse".

Я везде читал, что Jsoup должен анализировать сжатый контент без необходимости делать что-то особенное, но, очевидно, чего-то не хватает.

Я пробовал много других способов, таких как использование Jsoup.connect (). get () или InpuStream, GZipInputStream и DataInpuStream.Я тоже попробовал методы gzDeflate () и gzencode () из PHP, но тоже не повезло.Я даже пытался не объявлять кодировку заголовка в PHP и пытаться выкачивать контент позже ... но это было настолько же умно, насколько эффективно ...

Это должно быть что-то "глупое", я скучаюно я просто не могу сказать, что ... у кого-нибудь есть идея?

(ps: я использую Jsoup 1.7.0, поэтому самый последний на данный момент)

1 Ответ

0 голосов
/ 04 июля 2014

Аскер указал в комментарии, что gzcompress писал CRC, который был и неверным, и неполным, согласно информации от здесь , рабочий код:

// Display the header of the gzip file
// Thanks ck@medienkombinat.de!
// Only display this once
echo "\x1f\x8b\x08\x00\x00\x00\x00\x00";

// Figure out the size and CRC of the original for later
$Size = strlen($contents);
$Crc = crc32($contents);

// Compress the data
$contents = gzcompress($contents, 9);

// We can't just output it here, since the CRC is messed up.
// If I try to "echo $contents" at this point, the compressed
// data is sent, but not completely.  There are four bytes at
// the end that are a CRC.  Three are sent.  The last one is
// left in limbo.  Also, if we "echo $contents", then the next
// byte we echo will not be sent to the client.  I am not sure
// if this is a bug in 4.0.2 or not, but the best way to avoid
// this is to put the correct CRC at the end of the compressed
// data.  (The one generated by gzcompress looks WAY wrong.)
// This will stop Opera from crashing, gunzip will work, and
// other browsers won't keep loading indefinately.
//
// Strip off the old CRC (it's there, but it won't be displayed
// all the way -- very odd)
$contents = substr($contents, 0, strlen($contents) - 4);

// Show only the compressed data
echo $contents;

// Output the CRC, then the size of the original
gzip_PrintFourChars($Crc);
gzip_PrintFourChars($Size);

Джонатан Хедли прокомментировал: «jsoup just использует нормальный Java GZIPInputStream для анализа gzip, поэтому вы столкнетесь с этой проблемой с любой программой Java». EOFException предположительно из-за неполного CRC.

...