001package org.apache.maven.wagon.shared.http;
002
003/*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements.  See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership.  The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License.  You may obtain a copy of the License at
011 *
012 *   http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied.  See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022import org.apache.http.Header;
023import org.apache.http.HttpHost;
024import org.apache.http.client.config.RequestConfig;
025import org.apache.http.message.BasicHeader;
026import org.apache.maven.wagon.Wagon;
027
028import java.net.InetAddress;
029import java.net.UnknownHostException;
030import java.util.Arrays;
031import java.util.Map;
032import java.util.Properties;
033import java.util.regex.Matcher;
034import java.util.regex.Pattern;
035
036/**
037 * Configuration helper class
038 */
039public class ConfigurationUtils
040{
041
042    private static final String SO_TIMEOUT                  = "http.socket.timeout";
043    private static final String STALE_CONNECTION_CHECK      = "http.connection.stalecheck";
044    private static final String CONNECTION_TIMEOUT          = "http.connection.timeout";
045    private static final String USE_EXPECT_CONTINUE         = "http.protocol.expect-continue";
046    private static final String DEFAULT_PROXY               = "http.route.default-proxy";
047    private static final String LOCAL_ADDRESS               = "http.route.local-address";
048    private static final String PROXY_AUTH_PREF             = "http.auth.proxy-scheme-pref";
049    private static final String TARGET_AUTH_PREF            = "http.auth.target-scheme-pref";
050    private static final String HANDLE_AUTHENTICATION       = "http.protocol.handle-authentication";
051    private static final String ALLOW_CIRCULAR_REDIRECTS    = "http.protocol.allow-circular-redirects";
052    private static final String CONN_MANAGER_TIMEOUT        = "http.conn-manager.timeout";
053    private static final String COOKIE_POLICY               = "http.protocol.cookie-policy";
054    private static final String MAX_REDIRECTS               = "http.protocol.max-redirects";
055    private static final String HANDLE_REDIRECTS            = "http.protocol.handle-redirects";
056    private static final String REJECT_RELATIVE_REDIRECT    = "http.protocol.reject-relative-redirect";
057
058    private static final String COERCE_PATTERN = "%(\\w+),(.+)";
059
060    public static void copyConfig( HttpMethodConfiguration config, RequestConfig.Builder builder )
061    {
062        if ( config.getConnectionTimeout() > 0 )
063        {
064            builder.setConnectTimeout( config.getConnectionTimeout() );
065        }
066        if ( config.getReadTimeout() > 0 )
067        {
068            builder.setSocketTimeout( config.getReadTimeout() );
069        }
070        Properties params = config.getParams();
071        if ( params != null )
072        {
073
074            Pattern coercePattern = Pattern.compile( COERCE_PATTERN );
075            for ( Map.Entry entry : params.entrySet() )
076            {
077                String key = (String) entry.getKey();
078                String value = (String) entry.getValue();
079                Matcher matcher = coercePattern.matcher( value );
080                if ( matcher.matches() )
081                {
082                    value = matcher.group( 2 );
083                }
084
085                if ( key.equals( SO_TIMEOUT ) )
086                {
087                    builder.setSocketTimeout( Integer.parseInt( value ) );
088                }
089                else if ( key.equals( STALE_CONNECTION_CHECK ) )
090                {
091                    builder.setStaleConnectionCheckEnabled( Boolean.valueOf( value ) );
092                }
093                else if ( key.equals( CONNECTION_TIMEOUT ) )
094                {
095                    builder.setConnectTimeout( Integer.parseInt( value ) );
096                }
097                else if ( key.equals( USE_EXPECT_CONTINUE ) )
098                {
099                    builder.setExpectContinueEnabled( Boolean.valueOf( value ) );
100                }
101                else if ( key.equals( DEFAULT_PROXY ) )
102                {
103                    builder.setProxy( new HttpHost( value ) );
104                }
105                else if ( key.equals( LOCAL_ADDRESS ) )
106                {
107                    try
108                    {
109                        builder.setLocalAddress( InetAddress.getByName( value ) );
110                    }
111                    catch ( UnknownHostException ignore )
112                    {
113                        // ignore
114                    }
115                }
116                else if ( key.equals( PROXY_AUTH_PREF ) )
117                {
118                    builder.setProxyPreferredAuthSchemes( Arrays.asList( value.split( "," ) ) );
119                }
120                else if ( key.equals( TARGET_AUTH_PREF ) )
121                {
122                    builder.setTargetPreferredAuthSchemes( Arrays.asList( value.split( "," ) ) );
123                }
124                else if ( key.equals( HANDLE_AUTHENTICATION ) )
125                {
126                    builder.setAuthenticationEnabled( Boolean.valueOf( value ) );
127                }
128                else if ( key.equals( ALLOW_CIRCULAR_REDIRECTS ) )
129                {
130                    builder.setCircularRedirectsAllowed( Boolean.valueOf( value ) );
131                }
132                else if ( key.equals( CONN_MANAGER_TIMEOUT ) )
133                {
134                    builder.setConnectionRequestTimeout( Integer.parseInt( value ) );
135                }
136                else if ( key.equals( COOKIE_POLICY ) )
137                {
138                    builder.setCookieSpec( value );
139                }
140                else if ( key.equals( MAX_REDIRECTS ) )
141                {
142                    builder.setMaxRedirects( Integer.parseInt( value ) );
143                }
144                else if ( key.equals( HANDLE_REDIRECTS ) )
145                {
146                    builder.setRedirectsEnabled( Boolean.valueOf( value ) );
147                }
148                else if ( key.equals( REJECT_RELATIVE_REDIRECT ) )
149                {
150                    builder.setRelativeRedirectsAllowed( !Boolean.valueOf( value ) );
151                }
152            }
153        }
154    }
155
156    public static Header[] asRequestHeaders( HttpMethodConfiguration config )
157    {
158        Properties headers = config.getHeaders();
159        if ( headers == null )
160        {
161            return new Header[0];
162        }
163
164        Header[] result = new Header[headers.size()];
165
166        int index = 0;
167        for ( Map.Entry entry : headers.entrySet() )
168        {
169            String key = (String) entry.getKey();
170            String value = (String) entry.getValue();
171
172            Header header = new BasicHeader( key, value );
173            result[index++] = header;
174        }
175
176        return result;
177    }
178
179    public static HttpMethodConfiguration merge( HttpMethodConfiguration defaults, HttpMethodConfiguration base,
180                                            HttpMethodConfiguration local )
181    {
182        HttpMethodConfiguration result = merge( defaults, base );
183        return merge( result, local );
184    }
185
186    public static HttpMethodConfiguration merge( HttpMethodConfiguration base, HttpMethodConfiguration local )
187    {
188        if ( base == null && local == null )
189        {
190            return null;
191        }
192        else if ( base == null )
193        {
194            return local;
195        }
196        else if ( local == null )
197        {
198            return base;
199        }
200        else
201        {
202            HttpMethodConfiguration result = base.copy();
203
204            if ( local.getConnectionTimeout() != Wagon.DEFAULT_CONNECTION_TIMEOUT )
205            {
206                result.setConnectionTimeout( local.getConnectionTimeout() );
207            }
208
209            if ( local.getReadTimeout() != Wagon.DEFAULT_READ_TIMEOUT )
210            {
211                result.setReadTimeout( local.getReadTimeout() );
212            }
213
214            if ( local.getHeaders() != null )
215            {
216                result.getHeaders().putAll( local.getHeaders() );
217            }
218
219            if ( local.getParams() != null )
220            {
221                result.getParams().putAll( local.getParams() );
222            }
223
224            if ( local.getUseDefaultHeaders() != null )
225            {
226                result.setUseDefaultHeaders( local.isUseDefaultHeaders() );
227            }
228
229            return result;
230        }
231    }
232
233}