View Javadoc

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  }