package org.apache.maven.wagon.shared.http;

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

import org.apache.http.Header;
import org.apache.http.HttpHost;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.message.BasicHeader;
import org.apache.maven.wagon.Wagon;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.Map;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

Configuration helper class
/** * Configuration helper class */
public class ConfigurationUtils { private static final String SO_TIMEOUT = "http.socket.timeout"; private static final String STALE_CONNECTION_CHECK = "http.connection.stalecheck"; private static final String CONNECTION_TIMEOUT = "http.connection.timeout"; private static final String USE_EXPECT_CONTINUE = "http.protocol.expect-continue"; private static final String DEFAULT_PROXY = "http.route.default-proxy"; private static final String LOCAL_ADDRESS = "http.route.local-address"; private static final String PROXY_AUTH_PREF = "http.auth.proxy-scheme-pref"; private static final String TARGET_AUTH_PREF = "http.auth.target-scheme-pref"; private static final String HANDLE_AUTHENTICATION = "http.protocol.handle-authentication"; private static final String ALLOW_CIRCULAR_REDIRECTS = "http.protocol.allow-circular-redirects"; private static final String CONN_MANAGER_TIMEOUT = "http.conn-manager.timeout"; private static final String COOKIE_POLICY = "http.protocol.cookie-policy"; private static final String MAX_REDIRECTS = "http.protocol.max-redirects"; private static final String HANDLE_REDIRECTS = "http.protocol.handle-redirects"; private static final String REJECT_RELATIVE_REDIRECT = "http.protocol.reject-relative-redirect"; private static final String COERCE_PATTERN = "%(\\w+),(.+)"; public static void copyConfig( HttpMethodConfiguration config, RequestConfig.Builder builder ) { if ( config.getConnectionTimeout() > 0 ) { builder.setConnectTimeout( config.getConnectionTimeout() ); } if ( config.getReadTimeout() > 0 ) { builder.setSocketTimeout( config.getReadTimeout() ); } Properties params = config.getParams(); if ( params != null ) { Pattern coercePattern = Pattern.compile( COERCE_PATTERN ); for ( Map.Entry entry : params.entrySet() ) { String key = (String) entry.getKey(); String value = (String) entry.getValue(); Matcher matcher = coercePattern.matcher( value ); if ( matcher.matches() ) { value = matcher.group( 2 ); } if ( key.equals( SO_TIMEOUT ) ) { builder.setSocketTimeout( Integer.parseInt( value ) ); } else if ( key.equals( STALE_CONNECTION_CHECK ) ) { builder.setStaleConnectionCheckEnabled( Boolean.valueOf( value ) ); } else if ( key.equals( CONNECTION_TIMEOUT ) ) { builder.setConnectTimeout( Integer.parseInt( value ) ); } else if ( key.equals( USE_EXPECT_CONTINUE ) ) { builder.setExpectContinueEnabled( Boolean.valueOf( value ) ); } else if ( key.equals( DEFAULT_PROXY ) ) { builder.setProxy( new HttpHost( value ) ); } else if ( key.equals( LOCAL_ADDRESS ) ) { try { builder.setLocalAddress( InetAddress.getByName( value ) ); } catch ( UnknownHostException ignore ) { // ignore } } else if ( key.equals( PROXY_AUTH_PREF ) ) { builder.setProxyPreferredAuthSchemes( Arrays.asList( value.split( "," ) ) ); } else if ( key.equals( TARGET_AUTH_PREF ) ) { builder.setTargetPreferredAuthSchemes( Arrays.asList( value.split( "," ) ) ); } else if ( key.equals( HANDLE_AUTHENTICATION ) ) { builder.setAuthenticationEnabled( Boolean.valueOf( value ) ); } else if ( key.equals( ALLOW_CIRCULAR_REDIRECTS ) ) { builder.setCircularRedirectsAllowed( Boolean.valueOf( value ) ); } else if ( key.equals( CONN_MANAGER_TIMEOUT ) ) { builder.setConnectionRequestTimeout( Integer.parseInt( value ) ); } else if ( key.equals( COOKIE_POLICY ) ) { builder.setCookieSpec( value ); } else if ( key.equals( MAX_REDIRECTS ) ) { builder.setMaxRedirects( Integer.parseInt( value ) ); } else if ( key.equals( HANDLE_REDIRECTS ) ) { builder.setRedirectsEnabled( Boolean.valueOf( value ) ); } else if ( key.equals( REJECT_RELATIVE_REDIRECT ) ) { builder.setRelativeRedirectsAllowed( !Boolean.valueOf( value ) ); } } } } public static Header[] asRequestHeaders( HttpMethodConfiguration config ) { Properties headers = config.getHeaders(); if ( headers == null ) { return new Header[0]; } Header[] result = new Header[headers.size()]; int index = 0; for ( Map.Entry entry : headers.entrySet() ) { String key = (String) entry.getKey(); String value = (String) entry.getValue(); Header header = new BasicHeader( key, value ); result[index++] = header; } return result; } public static HttpMethodConfiguration merge( HttpMethodConfiguration defaults, HttpMethodConfiguration base, HttpMethodConfiguration local ) { HttpMethodConfiguration result = merge( defaults, base ); return merge( result, local ); } public static HttpMethodConfiguration merge( HttpMethodConfiguration base, HttpMethodConfiguration local ) { if ( base == null && local == null ) { return null; } else if ( base == null ) { return local; } else if ( local == null ) { return base; } else { HttpMethodConfiguration result = base.copy(); if ( local.getConnectionTimeout() != Wagon.DEFAULT_CONNECTION_TIMEOUT ) { result.setConnectionTimeout( local.getConnectionTimeout() ); } if ( local.getReadTimeout() != Wagon.DEFAULT_READ_TIMEOUT ) { result.setReadTimeout( local.getReadTimeout() ); } if ( local.getHeaders() != null ) { result.getHeaders().putAll( local.getHeaders() ); } if ( local.getParams() != null ) { result.getParams().putAll( local.getParams() ); } if ( local.getUseDefaultHeaders() != null ) { result.setUseDefaultHeaders( local.isUseDefaultHeaders() ); } return result; } } }