Activar Gzip en peticiones Http en Android

Después de llevar mucho tiempo trabajando con las aplicaciones llegué a la conclusión que era necesario reducir la cantidad de datos que se consumía por parte del usuario. Aunque revisando las estadísticas de una persona que hace uso a diario de Infobolsa CED desde el mes de Noviembre no ha llegado a las 400kb es necesario seguir reduciendo esa cantidad de datos.

Para ello, nos pusimos con intentar hacer uso de las cabeceras Gzip en Android. Todo lo necesario es llamar a este método que hemos implementado justo al crear el objeto DefaultHttpClient


private void addGzipInterceptors(DefaultHttpClient httpclient){
	httpclient.addRequestInterceptor(new HttpRequestInterceptor() {

		public void process(
                    final HttpRequest request,
                    final HttpContext context) throws HttpException, IOException {
               if (!request.containsHeader("Accept-Encoding")) {
                   request.addHeader("Accept-Encoding", "gzip");
               }
           }

        });

    httpclient.addResponseInterceptor(new HttpResponseInterceptor() {

         public void process(final HttpResponse response, final HttpContext context) throws HttpException, IOException {
                HttpEntity entity = response.getEntity();
                if (entity != null) {
                    Header ceheader = entity.getContentEncoding();
                    if (ceheader != null) {
                        HeaderElement[] codecs = ceheader.getElements();
                        for (int i = 0; i < codecs.length; i++) {
                            if (codecs[i].getName().equalsIgnoreCase("gzip")) {
                                response.setEntity(
                                        new CtrlzAppsGzipDescompressingEntity(response.getEntity()));
                                return;
                            }
                        }
                    }
                }
            }
        });
}


Todo era muy sencillo hasta que verificamos que los paquetes de httpclient que dispone Android no contienen la clase para interpretar Gzip. Para ello nos pusimos manos a la obra implementando una clase para interpretar esa cabecera.

public class CtrlzAppsGzipDescompressingEntity extends HttpEntityWrapper{

     public CtrlzAppsGzipDescompressingEntity(final HttpEntity entity) {
          super(entity);
     }

     public InputStream getContent()
              throws IOException, IllegalStateException {

          InputStream wrappedin = wrappedEntity.getContent();
          return new GZIPInputStream(wrappedin);
     }

    public long getContentLength() {
          // la longitud de un contenido ungzipped es desconocido.
          return -1;
    }
}

Y eso es todo, nuestra aplicación Android ya está preparada para interpretar la cabecera Gzip y de esta forma reducir la cantidad de datos que se transfieren.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: