001/* 002 * Copyright 2008-2011 Thomas Nichols. http://blog.thomnichols.org 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 * 016 * You are receiving this code free of charge, which represents many hours of 017 * effort from other individuals and corporations. As a responsible member 018 * of the community, you are encouraged (but not required) to donate any 019 * enhancements or improvements back to the community under a similar open 020 * source license. Thank you. -TMN 021 */ 022package groovyx.net.http; 023 024import groovyx.net.http.ContentEncoding.Type; 025 026import java.util.HashMap; 027import java.util.Map; 028 029import org.apache.http.client.HttpClient; 030import org.apache.http.impl.client.AbstractHttpClient; 031 032/** 033 * Keeps track of available content-encoding handlers. 034 * @author <a href='mailto:[email protected]'>Tom Nichols</a> 035 */ 036public class ContentEncodingRegistry { 037 038 protected Map<String,ContentEncoding> availableEncoders = getDefaultEncoders(); 039 040 /** 041 * This implementation adds a {@link GZIPEncoding} and {@link DeflateEncoding} 042 * handler to the registry. Override this method to provide a different set 043 * of defaults. 044 * @return a map to content-encoding strings to {@link ContentEncoding} handlers. 045 */ 046 protected Map<String,ContentEncoding> getDefaultEncoders() { 047 Map<String, ContentEncoding> map = new HashMap<String, ContentEncoding>(); 048 map.put( Type.GZIP.toString(), new GZIPEncoding() ); 049 map.put( Type.DEFLATE.toString(), new DeflateEncoding() ); 050 return map; 051 } 052 053 /** 054 * Add the request and response interceptors to the {@link HttpClient}, 055 * which will provide transparent decoding of the given content-encoding 056 * types. This method is called by HTTPBuilder and probably should not need 057 * be modified by sub-classes. 058 * @param client client on which to set the request and response interceptors 059 * @param encodings encoding name (either a {@link ContentEncoding.Type} or 060 * a <code>content-encoding</code> string. 061 */ 062 void setInterceptors( final AbstractHttpClient client, Object... encodings ) { 063 // remove any encoding interceptors that are already set 064 client.removeRequestInterceptorByClass( ContentEncoding.RequestInterceptor.class ); 065 client.removeResponseInterceptorByClass( ContentEncoding.ResponseInterceptor.class ); 066 067 for ( Object encName : encodings ) { 068 ContentEncoding enc = availableEncoders.get( encName.toString() ); 069 if ( enc == null ) continue; 070 client.addRequestInterceptor( enc.getRequestInterceptor() ); 071 client.addResponseInterceptor( enc.getResponseInterceptor() ); 072 } 073 } 074}