1 /* 2 * Copyright 2003-2008 the original author or authors. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 * 16 * You are receiving this code free of charge, which represents many hours of 17 * effort from other individuals and corporations. As a responsible member 18 * of the community, you are asked (but not required) to donate any 19 * enhancements or improvements back to the community under a similar open 20 * source license. Thank you. -TMN 21 */ 22 package groovyx.net.http; 23 24 import groovyx.net.http.ContentEncoding.Type; 25 26 import java.util.HashMap; 27 import java.util.Map; 28 29 import org.apache.http.client.HttpClient; 30 import org.apache.http.impl.client.AbstractHttpClient; 31 32 /** 33 * Keeps track of available content-encoding handlers. 34 * @author <a href='mailto:tnichols@enernoc.com'>Tom Nichols</a> 35 */ 36 public class ContentEncodingRegistry { 37 38 protected Map<String,ContentEncoding> availableEncoders = getDefaultEncoders(); 39 40 /** 41 * This implementation adds a {@link GZIPEncoding} and {@link DeflateEncoding} 42 * handler to the registry. Override this method to provide a different set 43 * of defaults. 44 * @return a map to content-encoding strings to {@link ContentEncoding} handlers. 45 */ 46 protected Map<String,ContentEncoding> getDefaultEncoders() { 47 Map<String, ContentEncoding> map = new HashMap<String, ContentEncoding>(); 48 map.put( Type.GZIP.toString(), new GZIPEncoding() ); 49 map.put( Type.DEFLATE.toString(), new DeflateEncoding() ); 50 return map; 51 } 52 53 /** 54 * Add the request and response interceptors to the {@link HttpClient}, 55 * which will provide transparent decoding of the given content-encoding 56 * types. This method is called by HTTPBuilder and probably should not need 57 * be modified by sub-classes. 58 * @param client client on which to set the request and response interceptors 59 * @param encodings encoding name (either a {@link ContentEncoding.Type} or 60 * a <code>content-encoding</code> string. 61 */ 62 void setInterceptors( final AbstractHttpClient client, Object... encodings ) { 63 // remove any encoding interceptors that are already set 64 client.removeRequestInterceptorByClass( ContentEncoding.RequestInterceptor.class ); 65 client.removeResponseInterceptorByClass( ContentEncoding.ResponseInterceptor.class ); 66 67 for ( Object encName : encodings ) { 68 ContentEncoding enc = availableEncoders.get( encName.toString() ); 69 if ( enc == null ) continue; 70 client.addRequestInterceptor( enc.getRequestInterceptor() ); 71 client.addResponseInterceptor( enc.getResponseInterceptor() ); 72 } 73 } 74 }