I can't find a way to attach a test project, so I just post the test file in here: package com.example.helloandroid;
import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.zip.GZIPInputStream; import android.util.Log; public class Tester { private final static String TAG = "GZIP"; public void testChunkedGZip(){ InputStream is = null; try { byte[] buf = new byte[512]; int read = -1; int readSize = 0; // Just pick a site, as long as it supported accept-encoding=gzip // and the response is large enough to have Transfer- Encoding=chunked. HttpURLConnection conn = (HttpURLConnection) new URL("http:// vnexpress.net/GL/Home/").openConnection(); conn.setRequestProperty("Accept-Encoding", "gzip"); conn.setRequestProperty("Connection", "Keep-Alive"); int response = conn.getResponseCode(); Log.d(TAG, "======================"); Log.d(TAG,"HTTP Response: " + response); Log.d(TAG,"header"); for (String headerName : conn.getHeaderFields().keySet()) { for (String headerValue : conn.getHeaderFields().get(headerName)) { Log.d(TAG,headerName + ":" + headerValue); } } Log.d(TAG,"body"); is = conn.getInputStream(); if (conn.getHeaderField("Content-encoding") != null && conn.getHeaderField("Content- encoding").trim().toLowerCase().equals("gzip")){ is = new GZIPInputStream(is); } while ((read = is.read(buf)) != -1 ) { readSize += read; } Log.d(TAG,"bytes read:" + readSize); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try{ if (is != null) is.close(); } catch(Exception e){} } } } ////////////////////// Testing Activity package com.example.helloandroid; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; public class HelloAndroid extends Activity { private Button button; private final static String TAG = "GZIP"; Runnable urlReaderRunnable = new Runnable(){ public void run() { Tester tester = new Tester(); try { tester.testChunkedGZip(); } catch (Exception e) { Log.d(TAG, "Exception", e); } } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.main); this.button = (Button) this.findViewById(R.id.TestButton); this.button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // 2nd click always return -1 // this is only happens when Connection = Keep-Alive, Content- Encoding=Gzip, Transfer-Encoding=Chunked // the error comes from InflaterInputStream (line 190-192) doesn't clean up // the last chunk (ending chunk) correctly. The last chunk is (0x) 30 0d 0a. // This is tested with Android 1.6 and 2.1 with the same result. Log.d(TAG, "Button is clicked"); new Thread(urlReaderRunnable).start(); } }); } } On Mar 3, 6:05 am, SN <sontran...@gmail.com> wrote: > Hi, > > I found a problem with GZIP input stream when wrapping InputStream > from HttpURLConnection. When the server response with Transfer- > Encoding=chunked, Content-Encoding=gzip and Connection=Keep-Alive. The > second post always return -1. > > After digging into the source code, I found the place that could be a > bug: > InflaterInputStream.java (line 190 to 192) > if (inf.needsInput()) { > fill(); > } > > Because InflaterInputStream doesn't need more input, it doesn't try to > read the end of chunked encoding (0x)(30 0a 0d) that cause the second > post to return with -1 every time. Does anybody have the same issue? > > Thanks, -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en