2011-07-20 61 views
0

我一直試圖讓這個東西有效,但它仍然不正確。我檢查了這麼多帖子,並測試了很多不同的實現,我不知道現在看什麼...Jsoup和gzip的HTML內容(Android)

這是我的情況,我有一個小的php測試文件(gz.php)在我的服務器,看起來像這樣:

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

這是最簡單的我可以做,它可以在任何網絡瀏覽器上正常工作。

現在我有使用Jsoup一個Android的活動,有這樣的代碼:

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

造成的「Jsoup.parse」行空EOFException類。

我到處讀過Jsoup應該解析gzip內容而不必做任何特別的事情,但很明顯,有一些缺失。

我已經嘗試了許多其他方式使用Jsoup.connect()。get()或InpuStream,GZipInputStream和DataInpuStream。我也嘗試了PHP中的gzDeflate()和gzencode()方法,但也沒有運氣。我甚至試圖不在PHP中聲明頭文件編碼,並在稍後嘗試縮小內容...但是它的效率和效果一樣聰明......

它必須是某種「愚蠢的」我失蹤了,但我只是不能說出什麼......任何人有一個想法?

(PS:我使用Jsoup 1.7.0,因此最新的一個截至目前)中的評價是gzcompress正在寫一個CRC,這是不正確的和不完整的指示

+0

你可以把PHP腳本放在某個地方,以便我可以測試它嗎?另外,1.6.1是最新版本。 –

+0

你是對的Jsoup版本...我的道歉(我知道我有最新的,而前一個是1.6.0 ...)。 – Trouiller

+0

今天早上我在這個頁面上找到了解決方案:[gzcompress manual](http://www.php.net/manual/en/function.gzcompress.php#8753)。看起來這是自動寫入頁面的crc問題。通常的瀏覽器可以,但不是Jsoup。所以我用了一種方法來壓制它,並且「voilà」。問題解決了!謝謝你的努力;) – Trouiller

回答

0

提問者,根據信息從here,操作碼的存在:

// Display the header of the gzip file 
// Thanks [email protected]! 
// 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); 

Jonathan Hedley評論說,「jsoup只uses a normal Java GZIPInputStream解析gzip的,所以你會打的問題與任何Java程序。」 EOFException可能是由於CRC不完整造成的。