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

Reply via email to