http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/2a129274/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/AbstractHttpClientWagon.java ---------------------------------------------------------------------- diff --git a/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/AbstractHttpClientWagon.java b/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/AbstractHttpClientWagon.java deleted file mode 100755 index 405f55e..0000000 --- a/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/AbstractHttpClientWagon.java +++ /dev/null @@ -1,1148 +0,0 @@ -package org.apache.maven.wagon.providers.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.HttpEntity; -import org.apache.http.HttpException; -import org.apache.http.HttpHost; -import org.apache.http.HttpResponse; -import org.apache.http.HttpStatus; -import org.apache.http.auth.AuthScope; -import org.apache.http.auth.ChallengeState; -import org.apache.http.auth.Credentials; -import org.apache.http.auth.NTCredentials; -import org.apache.http.auth.UsernamePasswordCredentials; -import org.apache.http.client.AuthCache; -import org.apache.http.client.CredentialsProvider; -import org.apache.http.client.config.CookieSpecs; -import org.apache.http.client.config.RequestConfig; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.methods.HttpHead; -import org.apache.http.client.methods.HttpPut; -import org.apache.http.client.methods.HttpUriRequest; -import org.apache.http.client.protocol.HttpClientContext; -import org.apache.http.client.utils.DateUtils; -import org.apache.http.config.Registry; -import org.apache.http.config.RegistryBuilder; -import org.apache.http.conn.HttpClientConnectionManager; -import org.apache.http.conn.socket.ConnectionSocketFactory; -import org.apache.http.conn.socket.PlainConnectionSocketFactory; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.SSLContextBuilder; -import org.apache.http.conn.ssl.SSLInitializationException; -import org.apache.http.entity.AbstractHttpEntity; -import org.apache.http.impl.auth.BasicScheme; -import org.apache.http.impl.client.BasicAuthCache; -import org.apache.http.impl.client.BasicCredentialsProvider; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; -import org.apache.http.message.BasicHeader; -import org.apache.http.protocol.HTTP; -import org.apache.http.util.EntityUtils; -import org.apache.maven.wagon.InputData; -import org.apache.maven.wagon.OutputData; -import org.apache.maven.wagon.PathUtils; -import org.apache.maven.wagon.ResourceDoesNotExistException; -import org.apache.maven.wagon.StreamWagon; -import org.apache.maven.wagon.TransferFailedException; -import org.apache.maven.wagon.Wagon; -import org.apache.maven.wagon.authorization.AuthorizationException; -import org.apache.maven.wagon.events.TransferEvent; -import org.apache.maven.wagon.proxy.ProxyInfo; -import org.apache.maven.wagon.repository.Repository; -import org.apache.maven.wagon.resource.Resource; -import org.apache.maven.wagon.shared.http.EncodingUtil; -import org.codehaus.plexus.util.IOUtil; -import org.codehaus.plexus.util.StringUtils; - -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLContext; -import java.io.ByteArrayInputStream; -import java.io.Closeable; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.nio.ByteBuffer; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.Locale; -import java.util.Map; -import java.util.Properties; -import java.util.TimeZone; -import java.util.concurrent.TimeUnit; - -/** - * @author <a href="michal.mac...@dimatics.com">Michal Maczka</a> - * @author <a href="mailto:ja...@atlassian.com">James William Dumay</a> - */ -public abstract class AbstractHttpClientWagon - extends StreamWagon -{ - private final class RequestEntityImplementation - extends AbstractHttpEntity - { - - private static final int BUFFER_SIZE = 2048; - - private final Resource resource; - - private final Wagon wagon; - - private ByteBuffer byteBuffer; - - private File source; - - private long length = -1; - - private RequestEntityImplementation( final InputStream stream, final Resource resource, final Wagon wagon, - final File source ) - throws TransferFailedException - { - if ( source != null ) - { - this.source = source; - } - else - { - try - { - byte[] bytes = IOUtil.toByteArray( stream ); - byteBuffer = ByteBuffer.allocate( bytes.length ); - byteBuffer.put( bytes ); - stream.close(); - } - catch ( IOException e ) - { - throw new TransferFailedException( e.getMessage(), e ); - } - finally - { - IOUtil.close( stream ); - } - } - this.resource = resource; - this.length = resource == null ? -1 : resource.getContentLength(); - - this.wagon = wagon; - } - - public long getContentLength() - { - return length; - } - - public InputStream getContent() - throws IOException, IllegalStateException - { - if ( this.source != null ) - { - return new FileInputStream( this.source ); - } - return new ByteArrayInputStream( this.byteBuffer.array() ); - } - - public boolean isRepeatable() - { - return true; - } - - public void writeTo( final OutputStream outputStream ) - throws IOException - { - if ( outputStream == null ) - { - throw new NullPointerException( "outputStream cannot be null" ); - } - TransferEvent transferEvent = - new TransferEvent( wagon, resource, TransferEvent.TRANSFER_PROGRESS, TransferEvent.REQUEST_PUT ); - transferEvent.setTimestamp( System.currentTimeMillis() ); - InputStream instream = ( this.source != null ) - ? new FileInputStream( this.source ) - : new ByteArrayInputStream( this.byteBuffer.array() ); - try - { - byte[] buffer = new byte[BUFFER_SIZE]; - int l; - if ( this.length < 0 ) - { - // until EOF - while ( ( l = instream.read( buffer ) ) != -1 ) - { - fireTransferProgress( transferEvent, buffer, -1 ); - outputStream.write( buffer, 0, l ); - } - } - else - { - // no need to consume more than length - long remaining = this.length; - while ( remaining > 0 ) - { - l = instream.read( buffer, 0, (int) Math.min( BUFFER_SIZE, remaining ) ); - if ( l == -1 ) - { - break; - } - fireTransferProgress( transferEvent, buffer, (int) Math.min( BUFFER_SIZE, remaining ) ); - outputStream.write( buffer, 0, l ); - remaining -= l; - } - } - } - finally - { - instream.close(); - } - } - - public boolean isStreaming() - { - return true; - } - } - - private static final TimeZone GMT_TIME_ZONE = TimeZone.getTimeZone( "GMT" ); - - /** - * use http(s) connection pool mechanism. - * <b>enabled by default</b> - */ - private static boolean persistentPool = - Boolean.valueOf( System.getProperty( "maven.wagon.http.pool", "true" ) ); - - /** - * skip failure on certificate validity checks. - * <b>disabled by default</b> - */ - private static final boolean SSL_INSECURE = - Boolean.valueOf( System.getProperty( "maven.wagon.http.ssl.insecure", "false" ) ); - - /** - * if using sslInsecure, certificate date issues will be ignored - * <b>disabled by default</b> - */ - private static final boolean IGNORE_SSL_VALIDITY_DATES = - Boolean.valueOf( System.getProperty( "maven.wagon.http.ssl.ignore.validity.dates", "false" ) ); - - /** - * If enabled, ssl hostname verifier does not check hostname. Disable this will use a browser compat hostname - * verifier <b>disabled by default</b> - */ - private static final boolean SSL_ALLOW_ALL = - Boolean.valueOf( System.getProperty( "maven.wagon.http.ssl.allowall", "false" ) ); - - - /** - * Maximum concurrent connections per distinct route. - * <b>20 by default</b> - */ - private static final int MAX_CONN_PER_ROUTE = - Integer.parseInt( System.getProperty( "maven.wagon.httpconnectionManager.maxPerRoute", "20" ) ); - - /** - * Maximum concurrent connections in total. - * <b>40 by default</b> - */ - private static final int MAX_CONN_TOTAL = - Integer.parseInt( System.getProperty( "maven.wagon.httpconnectionManager.maxTotal", "40" ) ); - - /** - * Internal connection manager - */ - private static HttpClientConnectionManager httpClientConnectionManager = createConnManager(); - - - /** - * See RFC6585 - */ - protected static final int SC_TOO_MANY_REQUESTS = 429; - - /** - * For exponential backoff. - */ - - /** - * Initial seconds to back off when a HTTP 429 received. - * Subsequent 429 responses result in exponental backoff. - * <b>5 by default</b> - * - * @since 2.7 - */ - private int initialBackoffSeconds = - Integer.parseInt( System.getProperty( "maven.wagon.httpconnectionManager.backoffSeconds", "5" ) ); - - /** - * The maximum amount of time we want to back off in the case of - * repeated HTTP 429 response codes. - * - * @since 2.7 - */ - private static final int MAX_BACKOFF_WAIT_SECONDS = - Integer.parseInt( System.getProperty( "maven.wagon.httpconnectionManager.maxBackoffSeconds", "180" ) ); - - - protected int backoff( int wait, String url ) - throws InterruptedException, TransferFailedException - { - TimeUnit.SECONDS.sleep( wait ); - int nextWait = wait * 2; - if ( nextWait >= getMaxBackoffWaitSeconds() ) - { - throw new TransferFailedException( - "Waited too long to access: " + url + ". Return code is: " + SC_TOO_MANY_REQUESTS ); - } - return nextWait; - } - - @SuppressWarnings( "checkstyle:linelength" ) - private static PoolingHttpClientConnectionManager createConnManager() - { - - String sslProtocolsStr = System.getProperty( "https.protocols" ); - String cipherSuitesStr = System.getProperty( "https.cipherSuites" ); - String[] sslProtocols = sslProtocolsStr != null ? sslProtocolsStr.split( " *, *" ) : null; - String[] cipherSuites = cipherSuitesStr != null ? cipherSuitesStr.split( " *, *" ) : null; - - SSLConnectionSocketFactory sslConnectionSocketFactory; - if ( SSL_INSECURE ) - { - try - { - SSLContext sslContext = new SSLContextBuilder().useSSL().loadTrustMaterial( null, - new RelaxedTrustStrategy( - IGNORE_SSL_VALIDITY_DATES ) ).build(); - sslConnectionSocketFactory = new SSLConnectionSocketFactory( sslContext, sslProtocols, cipherSuites, - SSL_ALLOW_ALL - ? SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER - : SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER ); - } - catch ( Exception ex ) - { - throw new SSLInitializationException( ex.getMessage(), ex ); - } - } - else - { - sslConnectionSocketFactory = - new SSLConnectionSocketFactory( HttpsURLConnection.getDefaultSSLSocketFactory(), sslProtocols, - cipherSuites, - SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER ); - } - - Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create().register( "http", - PlainConnectionSocketFactory.INSTANCE ).register( - "https", sslConnectionSocketFactory ).build(); - - PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager( registry ); - if ( persistentPool ) - { - connManager.setDefaultMaxPerRoute( MAX_CONN_PER_ROUTE ); - connManager.setMaxTotal( MAX_CONN_TOTAL ); - } - else - { - connManager.setMaxTotal( 1 ); - } - return connManager; - } - - private static CloseableHttpClient httpClient = createClient(); - - private static CloseableHttpClient createClient() - { - return HttpClientBuilder.create() // - .useSystemProperties() // - .disableConnectionState() // - .setConnectionManager( httpClientConnectionManager ) // - .build(); - } - - private CredentialsProvider credentialsProvider; - - private AuthCache authCache; - - private Closeable closeable; - - /** - * @plexus.configuration - * @deprecated Use httpConfiguration instead. - */ - private Properties httpHeaders; - - /** - * @since 1.0-beta-6 - */ - private HttpConfiguration httpConfiguration; - - /** - * Basic auth scope overrides - * @since 2.8 - */ - private BasicAuthScope basicAuth; - - /** - * Proxy basic auth scope overrides - * @since 2.8 - */ - private BasicAuthScope proxyAuth; - - public void openConnectionInternal() - { - repository.setUrl( getURL( repository ) ); - - credentialsProvider = new BasicCredentialsProvider(); - authCache = new BasicAuthCache(); - - if ( authenticationInfo != null ) - { - - String username = authenticationInfo.getUserName(); - String password = authenticationInfo.getPassword(); - - if ( StringUtils.isNotEmpty( username ) && StringUtils.isNotEmpty( password ) ) - { - Credentials creds = new UsernamePasswordCredentials( username, password ); - - String host = getRepository().getHost(); - int port = getRepository().getPort(); - - credentialsProvider.setCredentials( getBasicAuthScope().getScope( host, port ), creds ); - } - } - - ProxyInfo proxyInfo = getProxyInfo( getRepository().getProtocol(), getRepository().getHost() ); - if ( proxyInfo != null ) - { - String proxyUsername = proxyInfo.getUserName(); - String proxyPassword = proxyInfo.getPassword(); - String proxyHost = proxyInfo.getHost(); - String proxyNtlmHost = proxyInfo.getNtlmHost(); - String proxyNtlmDomain = proxyInfo.getNtlmDomain(); - if ( proxyHost != null ) - { - if ( proxyUsername != null && proxyPassword != null ) - { - Credentials creds; - if ( proxyNtlmHost != null || proxyNtlmDomain != null ) - { - creds = new NTCredentials( proxyUsername, proxyPassword, proxyNtlmHost, proxyNtlmDomain ); - } - else - { - creds = new UsernamePasswordCredentials( proxyUsername, proxyPassword ); - } - - int proxyPort = proxyInfo.getPort(); - - AuthScope authScope = getProxyBasicAuthScope().getScope( proxyHost, proxyPort ); - credentialsProvider.setCredentials( authScope, creds ); - } - } - } - } - - public void closeConnection() - { - if ( !persistentPool ) - { - httpClientConnectionManager.closeIdleConnections( 0, TimeUnit.MILLISECONDS ); - } - - if ( authCache != null ) - { - authCache.clear(); - authCache = null; - } - - if ( credentialsProvider != null ) - { - credentialsProvider.clear(); - credentialsProvider = null; - } - } - - public static void setPersistentPool( boolean persistentPool ) - { - persistentPool = persistentPool; - } - - public static void setPoolingHttpClientConnectionManager( - PoolingHttpClientConnectionManager poolingHttpClientConnectionManager ) - { - httpClientConnectionManager = poolingHttpClientConnectionManager; - httpClient = createClient(); - } - - public void put( File source, String resourceName ) - throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException - { - Resource resource = new Resource( resourceName ); - - firePutInitiated( resource, source ); - - resource.setContentLength( source.length() ); - - resource.setLastModified( source.lastModified() ); - - put( null, resource, source ); - } - - public void putFromStream( final InputStream stream, String destination, long contentLength, long lastModified ) - throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException - { - Resource resource = new Resource( destination ); - - firePutInitiated( resource, null ); - - resource.setContentLength( contentLength ); - - resource.setLastModified( lastModified ); - - put( stream, resource, null ); - } - - private void put( final InputStream stream, Resource resource, File source ) - throws TransferFailedException, AuthorizationException, ResourceDoesNotExistException - { - put( resource, source, new RequestEntityImplementation( stream, resource, this, source ) ); - } - - private void put( Resource resource, File source, HttpEntity httpEntity ) - throws TransferFailedException, AuthorizationException, ResourceDoesNotExistException - { - put( resource, source, httpEntity, buildUrl( resource ) ); - } - - /** - * Builds a complete URL string from the repository URL and the relative path of the resource passed. - * - * @param resource the resource to extract the relative path from. - * @return the complete URL - */ - private String buildUrl( Resource resource ) - { - return EncodingUtil.encodeURLToString( getRepository().getUrl(), resource.getName() ); - } - - - private void put( Resource resource, File source, HttpEntity httpEntity, String url ) - throws TransferFailedException, AuthorizationException, ResourceDoesNotExistException - { - put( getInitialBackoffSeconds(), resource, source, httpEntity, url ); - } - - - private void put( int wait, Resource resource, File source, HttpEntity httpEntity, String url ) - throws TransferFailedException, AuthorizationException, ResourceDoesNotExistException - { - - //Parent directories need to be created before posting - try - { - mkdirs( PathUtils.dirname( resource.getName() ) ); - } - catch ( HttpException he ) - { - fireTransferError( resource, he, TransferEvent.REQUEST_PUT ); - } - catch ( IOException e ) - { - fireTransferError( resource, e, TransferEvent.REQUEST_PUT ); - } - - // preemptive for put - // TODO: is it a good idea, though? 'Expect-continue' handshake would serve much better - - Repository repo = getRepository(); - HttpHost targetHost = new HttpHost( repo.getHost(), repo.getPort(), repo.getProtocol() ); - AuthScope targetScope = getBasicAuthScope().getScope( targetHost ); - - if ( credentialsProvider.getCredentials( targetScope ) != null ) - { - BasicScheme targetAuth = new BasicScheme(); - authCache.put( targetHost, targetAuth ); - } - - HttpPut putMethod = new HttpPut( url ); - - firePutStarted( resource, source ); - - try - { - putMethod.setEntity( httpEntity ); - - CloseableHttpResponse response = execute( putMethod ); - try - { - int statusCode = response.getStatusLine().getStatusCode(); - String reasonPhrase = ", ReasonPhrase: " + response.getStatusLine().getReasonPhrase() + "."; - fireTransferDebug( url + " - Status code: " + statusCode + reasonPhrase ); - - // Check that we didn't run out of retries. - switch ( statusCode ) - { - // Success Codes - case HttpStatus.SC_OK: // 200 - case HttpStatus.SC_CREATED: // 201 - case HttpStatus.SC_ACCEPTED: // 202 - case HttpStatus.SC_NO_CONTENT: // 204 - break; - // handle all redirect even if http specs says " the user agent MUST NOT automatically redirect - // the request unless it can be confirmed by the user" - case HttpStatus.SC_MOVED_PERMANENTLY: // 301 - case HttpStatus.SC_MOVED_TEMPORARILY: // 302 - case HttpStatus.SC_SEE_OTHER: // 303 - put( resource, source, httpEntity, calculateRelocatedUrl( response ) ); - return; - case HttpStatus.SC_FORBIDDEN: - fireSessionConnectionRefused(); - throw new AuthorizationException( "Access denied to: " + url + reasonPhrase ); - - case HttpStatus.SC_NOT_FOUND: - throw new ResourceDoesNotExistException( "File: " + url + " does not exist" + reasonPhrase ); - - case SC_TOO_MANY_REQUESTS: - put( backoff( wait, url ), resource, source, httpEntity, url ); - break; - //add more entries here - default: - TransferFailedException e = new TransferFailedException( - "Failed to transfer file: " + url + ". Return code is: " + statusCode + reasonPhrase ); - fireTransferError( resource, e, TransferEvent.REQUEST_PUT ); - throw e; - } - - firePutCompleted( resource, source ); - - EntityUtils.consume( response.getEntity() ); - } - finally - { - response.close(); - } - } - catch ( IOException e ) - { - fireTransferError( resource, e, TransferEvent.REQUEST_PUT ); - - throw new TransferFailedException( e.getMessage(), e ); - } - catch ( HttpException e ) - { - fireTransferError( resource, e, TransferEvent.REQUEST_PUT ); - - throw new TransferFailedException( e.getMessage(), e ); - } - catch ( InterruptedException e ) - { - fireTransferError( resource, e, TransferEvent.REQUEST_PUT ); - - throw new TransferFailedException( e.getMessage(), e ); - } - - } - - protected String calculateRelocatedUrl( HttpResponse response ) - { - Header locationHeader = response.getFirstHeader( "Location" ); - String locationField = locationHeader.getValue(); - // is it a relative Location or a full ? - return locationField.startsWith( "http" ) ? locationField : getURL( getRepository() ) + '/' + locationField; - } - - protected void mkdirs( String dirname ) - throws HttpException, IOException - { - // nothing to do - } - - public boolean resourceExists( String resourceName ) - throws TransferFailedException, AuthorizationException - { - return resourceExists( getInitialBackoffSeconds(), resourceName ); - } - - - private boolean resourceExists( int wait, String resourceName ) - throws TransferFailedException, AuthorizationException - { - String repositoryUrl = getRepository().getUrl(); - String url = repositoryUrl + ( repositoryUrl.endsWith( "/" ) ? "" : "/" ) + resourceName; - HttpHead headMethod = new HttpHead( url ); - try - { - CloseableHttpResponse response = execute( headMethod ); - try - { - int statusCode = response.getStatusLine().getStatusCode(); - String reasonPhrase = ", ReasonPhrase: " + response.getStatusLine().getReasonPhrase() + "."; - boolean result; - switch ( statusCode ) - { - case HttpStatus.SC_OK: - result = true; - break; - case HttpStatus.SC_NOT_MODIFIED: - result = true; - break; - case HttpStatus.SC_FORBIDDEN: - throw new AuthorizationException( "Access denied to: " + url + reasonPhrase ); - - case HttpStatus.SC_UNAUTHORIZED: - throw new AuthorizationException( "Not authorized " + reasonPhrase ); - - case HttpStatus.SC_PROXY_AUTHENTICATION_REQUIRED: - throw new AuthorizationException( "Not authorized by proxy " + reasonPhrase ); - - case HttpStatus.SC_NOT_FOUND: - result = false; - break; - - case SC_TOO_MANY_REQUESTS: - return resourceExists( backoff( wait, resourceName ), resourceName ); - - //add more entries here - default: - throw new TransferFailedException( - "Failed to transfer file: " + url + ". Return code is: " + statusCode + reasonPhrase ); - } - - EntityUtils.consume( response.getEntity() ); - return result; - } - finally - { - response.close(); - } - } - catch ( IOException e ) - { - throw new TransferFailedException( e.getMessage(), e ); - } - catch ( HttpException e ) - { - throw new TransferFailedException( e.getMessage(), e ); - } - catch ( InterruptedException e ) - { - throw new TransferFailedException( e.getMessage(), e ); - } - - } - - protected CloseableHttpResponse execute( HttpUriRequest httpMethod ) - throws HttpException, IOException - { - setHeaders( httpMethod ); - String userAgent = getUserAgent( httpMethod ); - if ( userAgent != null ) - { - httpMethod.setHeader( HTTP.USER_AGENT, userAgent ); - } - - RequestConfig.Builder requestConfigBuilder = RequestConfig.custom(); - // WAGON-273: default the cookie-policy to browser compatible - requestConfigBuilder.setCookieSpec( CookieSpecs.BROWSER_COMPATIBILITY ); - - Repository repo = getRepository(); - ProxyInfo proxyInfo = getProxyInfo( repo.getProtocol(), repo.getHost() ); - if ( proxyInfo != null ) - { - HttpHost proxy = new HttpHost( proxyInfo.getHost(), proxyInfo.getPort() ); - requestConfigBuilder.setProxy( proxy ); - } - - HttpMethodConfiguration config = - httpConfiguration == null ? null : httpConfiguration.getMethodConfiguration( httpMethod ); - - if ( config != null ) - { - ConfigurationUtils.copyConfig( config, requestConfigBuilder ); - } - else - { - requestConfigBuilder.setSocketTimeout( getReadTimeout() ); - if ( httpMethod instanceof HttpPut ) - { - requestConfigBuilder.setExpectContinueEnabled( true ); - } - } - - if ( httpMethod instanceof HttpPut ) - { - requestConfigBuilder.setRedirectsEnabled( false ); - } - - HttpClientContext localContext = HttpClientContext.create(); - localContext.setCredentialsProvider( credentialsProvider ); - localContext.setAuthCache( authCache ); - localContext.setRequestConfig( requestConfigBuilder.build() ); - - if ( config != null && config.isUsePreemptive() ) - { - HttpHost targetHost = new HttpHost( repo.getHost(), repo.getPort(), repo.getProtocol() ); - AuthScope targetScope = getBasicAuthScope().getScope( targetHost ); - - if ( credentialsProvider.getCredentials( targetScope ) != null ) - { - BasicScheme targetAuth = new BasicScheme(); - authCache.put( targetHost, targetAuth ); - } - } - - if ( proxyInfo != null ) - { - if ( proxyInfo.getHost() != null ) - { - HttpHost proxyHost = new HttpHost( proxyInfo.getHost(), proxyInfo.getPort() ); - AuthScope proxyScope = getProxyBasicAuthScope().getScope( proxyHost ); - - if ( credentialsProvider.getCredentials( proxyScope ) != null ) - { - /* This is extremely ugly because we need to set challengeState to PROXY, but - * the constructor is deprecated. Alternatively, we could subclass BasicScheme - * to ProxyBasicScheme and set the state internally in the constructor. - */ - BasicScheme proxyAuth = new BasicScheme( ChallengeState.PROXY ); - authCache.put( proxyHost, proxyAuth ); - } - } - } - - return httpClient.execute( httpMethod, localContext ); - } - - protected void setHeaders( HttpUriRequest method ) - { - HttpMethodConfiguration config = - httpConfiguration == null ? null : httpConfiguration.getMethodConfiguration( method ); - if ( config == null || config.isUseDefaultHeaders() ) - { - // TODO: merge with the other headers and have some better defaults, unify with lightweight headers - method.addHeader( "Cache-control", "no-cache" ); - method.addHeader( "Cache-store", "no-store" ); - method.addHeader( "Pragma", "no-cache" ); - method.addHeader( "Expires", "0" ); - method.addHeader( "Accept-Encoding", "gzip" ); - } - - if ( httpHeaders != null ) - { - for ( Map.Entry<Object, Object> entry : httpHeaders.entrySet() ) - { - method.setHeader( (String) entry.getKey(), (String) entry.getValue() ); - } - } - - Header[] headers = config == null ? null : config.asRequestHeaders(); - if ( headers != null ) - { - for ( Header header : headers ) - { - method.setHeader( header ); - } - } - } - - protected String getUserAgent( HttpUriRequest method ) - { - if ( httpHeaders != null ) - { - String value = (String) httpHeaders.get( "User-Agent" ); - if ( value != null ) - { - return value; - } - } - HttpMethodConfiguration config = - httpConfiguration == null ? null : httpConfiguration.getMethodConfiguration( method ); - - if ( config != null ) - { - return (String) config.getHeaders().get( "User-Agent" ); - } - return null; - } - - /** - * getUrl - * Implementors can override this to remove unwanted parts of the url such as role-hints - * - * @param repository - * @return - */ - protected String getURL( Repository repository ) - { - return repository.getUrl(); - } - - public HttpConfiguration getHttpConfiguration() - { - return httpConfiguration; - } - - public void setHttpConfiguration( HttpConfiguration httpConfiguration ) - { - this.httpConfiguration = httpConfiguration; - } - - /** - * Get the override values for standard HttpClient AuthScope - * - * @return the basicAuth - */ - public BasicAuthScope getBasicAuthScope() - { - if ( basicAuth == null ) - { - basicAuth = new BasicAuthScope(); - } - return basicAuth; - } - - /** - * Set the override values for standard HttpClient AuthScope - * - * @param basicAuth the AuthScope to set - */ - public void setBasicAuthScope( BasicAuthScope basicAuth ) - { - this.basicAuth = basicAuth; - } - - /** - * Get the override values for proxy HttpClient AuthScope - * - * @return the proxyAuth - */ - public BasicAuthScope getProxyBasicAuthScope() - { - if ( proxyAuth == null ) - { - proxyAuth = new BasicAuthScope(); - } - return proxyAuth; - } - - /** - * Set the override values for proxy HttpClient AuthScope - * - * @param proxyAuth the AuthScope to set - */ - public void setProxyBasicAuthScope( BasicAuthScope proxyAuth ) - { - this.proxyAuth = proxyAuth; - } - - public void fillInputData( InputData inputData ) - throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException - { - fillInputData( getInitialBackoffSeconds(), inputData ); - } - - private void fillInputData( int wait, InputData inputData ) - throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException - { - Resource resource = inputData.getResource(); - - String repositoryUrl = getRepository().getUrl(); - String url = repositoryUrl + ( repositoryUrl.endsWith( "/" ) ? "" : "/" ) + resource.getName(); - HttpGet getMethod = new HttpGet( url ); - long timestamp = resource.getLastModified(); - if ( timestamp > 0 ) - { - SimpleDateFormat fmt = new SimpleDateFormat( "EEE, dd-MMM-yy HH:mm:ss zzz", Locale.US ); - fmt.setTimeZone( GMT_TIME_ZONE ); - Header hdr = new BasicHeader( "If-Modified-Since", fmt.format( new Date( timestamp ) ) ); - fireTransferDebug( "sending ==> " + hdr + "(" + timestamp + ")" ); - getMethod.addHeader( hdr ); - } - - try - { - CloseableHttpResponse response = execute( getMethod ); - closeable = response; - int statusCode = response.getStatusLine().getStatusCode(); - - String reasonPhrase = ", ReasonPhrase:" + response.getStatusLine().getReasonPhrase() + "."; - - fireTransferDebug( url + " - Status code: " + statusCode + reasonPhrase ); - - switch ( statusCode ) - { - case HttpStatus.SC_OK: - break; - - case HttpStatus.SC_NOT_MODIFIED: - // return, leaving last modified set to original value so getIfNewer should return unmodified - return; - case HttpStatus.SC_FORBIDDEN: - fireSessionConnectionRefused(); - throw new AuthorizationException( "Access denied to: " + url + " " + reasonPhrase ); - - case HttpStatus.SC_UNAUTHORIZED: - fireSessionConnectionRefused(); - throw new AuthorizationException( "Not authorized " + reasonPhrase ); - - case HttpStatus.SC_PROXY_AUTHENTICATION_REQUIRED: - fireSessionConnectionRefused(); - throw new AuthorizationException( "Not authorized by proxy " + reasonPhrase ); - - case HttpStatus.SC_NOT_FOUND: - throw new ResourceDoesNotExistException( "File: " + url + " " + reasonPhrase ); - - case SC_TOO_MANY_REQUESTS: - fillInputData( backoff( wait, url ), inputData ); - break; - - // add more entries here - default: - cleanupGetTransfer( resource ); - TransferFailedException e = new TransferFailedException( - "Failed to transfer file: " + url + ". Return code is: " + statusCode + " " + reasonPhrase ); - fireTransferError( resource, e, TransferEvent.REQUEST_GET ); - throw e; - } - - Header contentLengthHeader = response.getFirstHeader( "Content-Length" ); - - if ( contentLengthHeader != null ) - { - try - { - long contentLength = Long.parseLong( contentLengthHeader.getValue() ); - - resource.setContentLength( contentLength ); - } - catch ( NumberFormatException e ) - { - fireTransferDebug( - "error parsing content length header '" + contentLengthHeader.getValue() + "' " + e ); - } - } - - Header lastModifiedHeader = response.getFirstHeader( "Last-Modified" ); - if ( lastModifiedHeader != null ) - { - Date lastModified = DateUtils.parseDate( lastModifiedHeader.getValue() ); - if ( lastModified != null ) - { - resource.setLastModified( lastModified.getTime() ); - fireTransferDebug( "last-modified = " + lastModifiedHeader.getValue() + " (" - + lastModified.getTime() + ")" ); - } - } - - HttpEntity entity = response.getEntity(); - if ( entity != null ) - { - inputData.setInputStream( entity.getContent() ); - } - } - catch ( IOException e ) - { - fireTransferError( resource, e, TransferEvent.REQUEST_GET ); - - throw new TransferFailedException( e.getMessage(), e ); - } - catch ( HttpException e ) - { - fireTransferError( resource, e, TransferEvent.REQUEST_GET ); - - throw new TransferFailedException( e.getMessage(), e ); - } - catch ( InterruptedException e ) - { - fireTransferError( resource, e, TransferEvent.REQUEST_GET ); - - throw new TransferFailedException( e.getMessage(), e ); - } - - } - - protected void cleanupGetTransfer( Resource resource ) - { - if ( closeable != null ) - { - try - { - closeable.close(); - } - catch ( IOException ignore ) - { - // ignore - } - - } - } - - - @Override - public void putFromStream( InputStream stream, String destination ) - throws TransferFailedException, ResourceDoesNotExistException, AuthorizationException - { - putFromStream( stream, destination, -1, -1 ); - } - - @Override - protected void putFromStream( InputStream stream, Resource resource ) - throws TransferFailedException, AuthorizationException, ResourceDoesNotExistException - { - putFromStream( stream, resource.getName(), -1, -1 ); - } - - public Properties getHttpHeaders() - { - return httpHeaders; - } - - public void setHttpHeaders( Properties httpHeaders ) - { - this.httpHeaders = httpHeaders; - } - - @Override - public void fillOutputData( OutputData outputData ) - throws TransferFailedException - { - // no needed in this implementation but throw an Exception if used - throw new IllegalStateException( "this wagon http client must not use fillOutputData" ); - } - - public int getInitialBackoffSeconds() - { - return initialBackoffSeconds; - } - - public void setInitialBackoffSeconds( int initialBackoffSeconds ) - { - this.initialBackoffSeconds = initialBackoffSeconds; - } - - public static int getMaxBackoffWaitSeconds() - { - return MAX_BACKOFF_WAIT_SECONDS; - } -}
http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/2a129274/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/BasicAuthScope.java ---------------------------------------------------------------------- diff --git a/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/BasicAuthScope.java b/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/BasicAuthScope.java deleted file mode 100644 index 5bcc2d3..0000000 --- a/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/BasicAuthScope.java +++ /dev/null @@ -1,168 +0,0 @@ -package org.apache.maven.wagon.providers.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.HttpHost; -import org.apache.http.auth.AuthScope; - -/** - * @since 2.8 - */ -public class BasicAuthScope -{ - private String host; - - private String port; - - private String realm; - - /** - * @return the host - */ - public String getHost() - { - return host; - } - - /** - * @param host the host to set - */ - public void setHost( String host ) - { - this.host = host; - } - - /** - * @return the realm - */ - public String getRealm() - { - return realm; - } - - /** - * @param realm the realm to set - */ - public void setRealm( String realm ) - { - this.realm = realm; - } - - /** - * Create an authScope given the /repository/host and /repository/password - * and the /server/basicAuth or /server/proxyBasicAuth host, port and realm - * settings. The basicAuth setting should override the repository settings - * host and/or port if host, port or realm is set to "ANY". - * <p/> - * Realm can also be set to a specific string and will be set if - * /server/basicAuthentication/realm is non-null - * - * @param host The server setting's /server/host value - * @param port The server setting's /server/port value - * @return - */ - public AuthScope getScope( String host, int port ) - { - if ( getHost() != null // - && "ANY".compareTo( getHost() ) == 0 // - && getPort() != null // - && "ANY".compareTo( getPort() ) == 0 // - && getRealm() != null // - && "ANY".compareTo( getRealm() ) == 0 ) - { - return AuthScope.ANY; - } - String scopeHost = host; - if ( getHost() != null ) - { - if ( "ANY".compareTo( getHost() ) == 0 ) - { - scopeHost = AuthScope.ANY_HOST; - } - else - { - scopeHost = getHost(); - } - } - - int scopePort = port > -1 ? port : AuthScope.ANY_PORT; - // -1 for server/port settings does this, but providing an override here - // in - // the BasicAuthScope config - if ( getPort() != null ) - { - if ( "ANY".compareTo( getPort() ) == 0 ) - { - scopePort = AuthScope.ANY_PORT; - } - else - { - scopePort = Integer.parseInt( getPort() ); - } - } - - String scopeRealm = AuthScope.ANY_REALM; - if ( getRealm() != null ) - { - if ( "ANY".compareTo( getRealm() ) != 0 ) - { - scopeRealm = getRealm(); - } - else - { - scopeRealm = getRealm(); - } - } - - return new AuthScope( scopeHost, scopePort, scopeRealm ); - } - - /** - * @return the port - */ - public String getPort() - { - return port; - } - - /** - * @param port the port to set - */ - public void setPort( String port ) - { - this.port = port; - } - - /** - * Given a HttpHost, return scope with overrides from appropriate basicAuth - * configuration. - * <p> - * Note: Protocol is ignored. AuthScope impl ignores it as well, but if that - * changed, there could be a problem. - * </p> - * - * @param targetHost - * @return - */ - public AuthScope getScope( HttpHost targetHost ) - { - return getScope( targetHost.getHostName(), targetHost.getPort() ); - } -} http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/2a129274/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/ConfigurationUtils.java ---------------------------------------------------------------------- diff --git a/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/ConfigurationUtils.java b/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/ConfigurationUtils.java deleted file mode 100755 index 4078c8c..0000000 --- a/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/ConfigurationUtils.java +++ /dev/null @@ -1,230 +0,0 @@ -package org.apache.maven.wagon.providers.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; - -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; - } - } - -} http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/2a129274/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/HttpConfiguration.java ---------------------------------------------------------------------- diff --git a/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/HttpConfiguration.java b/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/HttpConfiguration.java deleted file mode 100644 index 87c8876..0000000 --- a/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/HttpConfiguration.java +++ /dev/null @@ -1,106 +0,0 @@ -package org.apache.maven.wagon.providers.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.client.methods.HttpGet; -import org.apache.http.client.methods.HttpHead; -import org.apache.http.client.methods.HttpPut; -import org.apache.http.client.methods.HttpUriRequest; - -/** - * - */ -public class HttpConfiguration -{ - - private static final HttpMethodConfiguration DEFAULT_PUT = - new HttpMethodConfiguration().addParam( "http.protocol.expect-continue", "%b,true" ); - - private HttpMethodConfiguration all; - - private HttpMethodConfiguration get; - - private HttpMethodConfiguration put; - - private HttpMethodConfiguration head; - - public HttpMethodConfiguration getAll() - { - return all; - } - - public HttpConfiguration setAll( HttpMethodConfiguration all ) - { - this.all = all; - return this; - } - - public HttpMethodConfiguration getGet() - { - return get; - } - - public HttpConfiguration setGet( HttpMethodConfiguration get ) - { - this.get = get; - return this; - } - - public HttpMethodConfiguration getPut() - { - return put; - } - - public HttpConfiguration setPut( HttpMethodConfiguration put ) - { - this.put = put; - return this; - } - - public HttpMethodConfiguration getHead() - { - return head; - } - - public HttpConfiguration setHead( HttpMethodConfiguration head ) - { - this.head = head; - return this; - } - - public HttpMethodConfiguration getMethodConfiguration( HttpUriRequest method ) - { - if ( method instanceof HttpGet ) - { - return ConfigurationUtils.merge( all, get ); - } - else if ( method instanceof HttpPut ) - { - return ConfigurationUtils.merge( DEFAULT_PUT, all, put ); - } - else if ( method instanceof HttpHead ) - { - return ConfigurationUtils.merge( all, head ); - } - - return all; - } - -} http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/2a129274/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/HttpMethodConfiguration.java ---------------------------------------------------------------------- diff --git a/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/HttpMethodConfiguration.java b/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/HttpMethodConfiguration.java deleted file mode 100755 index aef7c9c..0000000 --- a/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/HttpMethodConfiguration.java +++ /dev/null @@ -1,174 +0,0 @@ -package org.apache.maven.wagon.providers.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 java.util.Map; -import java.util.Properties; - -import org.apache.http.Header; -import org.apache.http.message.BasicHeader; -import org.apache.maven.wagon.Wagon; - -/** - * - */ -public class HttpMethodConfiguration -{ - - private Boolean useDefaultHeaders; - - private Properties headers = new Properties(); - - private Properties params = new Properties(); - - private int connectionTimeout = Wagon.DEFAULT_CONNECTION_TIMEOUT; - - private int readTimeout = - Integer.parseInt( System.getProperty( "maven.wagon.rto", Integer.toString( Wagon.DEFAULT_READ_TIMEOUT ) ) ); - - private boolean usePreemptive = false; - - public boolean isUseDefaultHeaders() - { - return useDefaultHeaders == null || useDefaultHeaders.booleanValue(); - } - - public HttpMethodConfiguration setUseDefaultHeaders( boolean useDefaultHeaders ) - { - this.useDefaultHeaders = Boolean.valueOf( useDefaultHeaders ); - return this; - } - - public Boolean getUseDefaultHeaders() - { - return useDefaultHeaders; - } - - public HttpMethodConfiguration addHeader( String header, String value ) - { - headers.setProperty( header, value ); - return this; - } - - public Properties getHeaders() - { - return headers; - } - - public HttpMethodConfiguration setHeaders( Properties headers ) - { - this.headers = headers; - return this; - } - - public HttpMethodConfiguration addParam( String param, String value ) - { - params.setProperty( param, value ); - return this; - } - - public Properties getParams() - { - return params; - } - - public HttpMethodConfiguration setParams( Properties params ) - { - this.params = params; - return this; - } - - public int getConnectionTimeout() - { - return connectionTimeout; - } - - public HttpMethodConfiguration setConnectionTimeout( int connectionTimeout ) - { - this.connectionTimeout = connectionTimeout; - return this; - } - - public int getReadTimeout() - { - return readTimeout; - } - - public HttpMethodConfiguration setReadTimeout( int readTimeout ) - { - this.readTimeout = readTimeout; - return this; - } - - public boolean isUsePreemptive() - { - return usePreemptive; - } - - public HttpMethodConfiguration setUsePreemptive( boolean usePreemptive ) - { - this.usePreemptive = usePreemptive; - return this; - } - - public Header[] asRequestHeaders() - { - 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; - } - - HttpMethodConfiguration copy() - { - HttpMethodConfiguration copy = new HttpMethodConfiguration(); - - copy.setConnectionTimeout( getConnectionTimeout() ); - copy.setReadTimeout( getReadTimeout() ); - if ( getHeaders() != null ) - { - copy.setHeaders( getHeaders() ); - } - - if ( getParams() != null ) - { - copy.setParams( getParams() ); - } - - copy.setUseDefaultHeaders( isUseDefaultHeaders() ); - - return copy; - } - -} http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/2a129274/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/HttpWagon.java ---------------------------------------------------------------------- diff --git a/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/HttpWagon.java b/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/HttpWagon.java index 9410c8f..6d2f5a1 100755 --- a/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/HttpWagon.java +++ b/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/HttpWagon.java @@ -27,6 +27,7 @@ import org.apache.http.client.methods.HttpGet; import org.apache.maven.wagon.ResourceDoesNotExistException; import org.apache.maven.wagon.TransferFailedException; import org.apache.maven.wagon.authorization.AuthorizationException; +import org.apache.maven.wagon.shared.http.AbstractHttpClientWagon; import org.apache.maven.wagon.shared.http.HtmlFileListParser; import java.io.IOException; http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/2a129274/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/RelaxedTrustStrategy.java ---------------------------------------------------------------------- diff --git a/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/RelaxedTrustStrategy.java b/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/RelaxedTrustStrategy.java deleted file mode 100644 index 94a0878..0000000 --- a/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/RelaxedTrustStrategy.java +++ /dev/null @@ -1,76 +0,0 @@ -package org.apache.maven.wagon.providers.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.conn.ssl.TrustStrategy; - -import java.security.cert.CertificateException; -import java.security.cert.CertificateExpiredException; -import java.security.cert.CertificateNotYetValidException; -import java.security.cert.X509Certificate; - -/** - * Relaxed X509 certificate trust manager: can ignore invalid certificate date. - * - * @author Olivier Lamy - * @since 2.0 - */ -public class RelaxedTrustStrategy - implements TrustStrategy -{ - private final boolean ignoreSSLValidityDates; - - public RelaxedTrustStrategy( boolean ignoreSSLValidityDates ) - { - this.ignoreSSLValidityDates = ignoreSSLValidityDates; - } - - public boolean isTrusted( X509Certificate[] certificates, String authType ) - throws CertificateException - { - if ( ( certificates != null ) && ( certificates.length == 1 ) ) - { - try - { - certificates[0].checkValidity(); - } - catch ( CertificateExpiredException e ) - { - if ( !ignoreSSLValidityDates ) - { - throw e; - } - } - catch ( CertificateNotYetValidException e ) - { - if ( !ignoreSSLValidityDates ) - { - throw e; - } - } - return true; - } - else - { - return false; - } - } - -} http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/2a129274/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/AbstractHttpClientWagonTest.java ---------------------------------------------------------------------- diff --git a/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/AbstractHttpClientWagonTest.java b/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/AbstractHttpClientWagonTest.java index 15b1f6b..e4091ec 100644 --- a/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/AbstractHttpClientWagonTest.java +++ b/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/AbstractHttpClientWagonTest.java @@ -22,6 +22,7 @@ package org.apache.maven.wagon.providers.http; import org.apache.maven.wagon.InputData; import org.apache.maven.wagon.repository.Repository; import org.apache.maven.wagon.resource.Resource; +import org.apache.maven.wagon.shared.http.AbstractHttpClientWagon; import org.junit.Test; public class AbstractHttpClientWagonTest http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/2a129274/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/BasicAuthScopeTest.java ---------------------------------------------------------------------- diff --git a/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/BasicAuthScopeTest.java b/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/BasicAuthScopeTest.java index 9cab689..708278c 100644 --- a/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/BasicAuthScopeTest.java +++ b/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/BasicAuthScopeTest.java @@ -20,6 +20,7 @@ package org.apache.maven.wagon.providers.http; */ import org.apache.http.auth.AuthScope; +import org.apache.maven.wagon.shared.http.BasicAuthScope; import org.junit.Assert; import org.junit.Test; http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/2a129274/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpClientWagonTest.java ---------------------------------------------------------------------- diff --git a/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpClientWagonTest.java b/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpClientWagonTest.java index 4634481..57552f4 100755 --- a/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpClientWagonTest.java +++ b/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpClientWagonTest.java @@ -23,10 +23,16 @@ package org.apache.maven.wagon.providers.http; import junit.framework.TestCase; import org.apache.http.Header; + + import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.HttpHead; import org.apache.maven.wagon.OutputData; import org.apache.maven.wagon.TransferFailedException; +import org.apache.maven.wagon.shared.http.AbstractHttpClientWagon; +import org.apache.maven.wagon.shared.http.ConfigurationUtils; +import org.apache.maven.wagon.shared.http.HttpConfiguration; +import org.apache.maven.wagon.shared.http.HttpMethodConfiguration; public class HttpClientWagonTest extends TestCase http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/2a129274/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpWagonPreemptiveTest.java ---------------------------------------------------------------------- diff --git a/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpWagonPreemptiveTest.java b/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpWagonPreemptiveTest.java index f8c8be5..cd12232 100644 --- a/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpWagonPreemptiveTest.java +++ b/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpWagonPreemptiveTest.java @@ -20,6 +20,8 @@ package org.apache.maven.wagon.providers.http; */ import org.apache.maven.wagon.Wagon; +import org.apache.maven.wagon.shared.http.HttpConfiguration; +import org.apache.maven.wagon.shared.http.HttpMethodConfiguration; /** * @author <a href="michal.mac...@dimatics.com">Michal Maczka</a> http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/2a129274/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpWagonTest.java ---------------------------------------------------------------------- diff --git a/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpWagonTest.java b/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpWagonTest.java index bcfaf2e..f872147 100755 --- a/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpWagonTest.java +++ b/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpWagonTest.java @@ -23,6 +23,8 @@ import java.util.Properties; import org.apache.maven.wagon.StreamingWagon; import org.apache.maven.wagon.http.HttpWagonTestCase; +import org.apache.maven.wagon.shared.http.HttpConfiguration; +import org.apache.maven.wagon.shared.http.HttpMethodConfiguration; /** * @author <a href="michal.mac...@dimatics.com">Michal Maczka</a> http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/2a129274/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpWagonTimeoutTest.java ---------------------------------------------------------------------- diff --git a/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpWagonTimeoutTest.java b/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpWagonTimeoutTest.java index 5983b4f..ee1d0ec 100644 --- a/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpWagonTimeoutTest.java +++ b/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpWagonTimeoutTest.java @@ -23,6 +23,8 @@ import org.apache.maven.wagon.FileTestUtils; import org.apache.maven.wagon.TransferFailedException; import org.apache.maven.wagon.Wagon; import org.apache.maven.wagon.repository.Repository; +import org.apache.maven.wagon.shared.http.HttpConfiguration; +import org.apache.maven.wagon.shared.http.HttpMethodConfiguration; import org.eclipse.jetty.servlet.ServletHolder; import java.io.File; http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/2a129274/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpsWagonPreemptiveTest.java ---------------------------------------------------------------------- diff --git a/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpsWagonPreemptiveTest.java b/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpsWagonPreemptiveTest.java index ace5b3c..25cc61c 100644 --- a/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpsWagonPreemptiveTest.java +++ b/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpsWagonPreemptiveTest.java @@ -20,6 +20,8 @@ package org.apache.maven.wagon.providers.http; */ import org.apache.maven.wagon.Wagon; +import org.apache.maven.wagon.shared.http.HttpConfiguration; +import org.apache.maven.wagon.shared.http.HttpMethodConfiguration; import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ssl.SslSocketConnector; http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/2a129274/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpsWagonTest.java ---------------------------------------------------------------------- diff --git a/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpsWagonTest.java b/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpsWagonTest.java index 7d0de20..9612a3a 100644 --- a/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpsWagonTest.java +++ b/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpsWagonTest.java @@ -43,11 +43,11 @@ public class HttpsWagonTest SslSocketConnector connector = new SslSocketConnector(); connector.setPort( server.getConnectors()[0].getPort() ); - connector.setKeystore( getTestPath( "src/test/resources/ssl/keystore" ) ); - connector.setPassword( "wagonhttp" ); - connector.setKeyPassword( "wagonhttp" ); - connector.setTruststore( getTestPath( "src/test/resources/ssl/keystore" ) ); - connector.setTrustPassword( "wagonhttp" ); + connector.getSslContextFactory().setKeyStorePath( "src/test/resources/ssl/keystore" ); + connector.getSslContextFactory().setKeyStorePassword( "wagonhttp" ); + connector.getSslContextFactory().setKeyManagerPassword( "wagonhttp" ); + connector.getSslContextFactory().setTrustStore( getTestPath( "src/test/resources/ssl/keystore" ) ); + connector.getSslContextFactory().setTrustStorePassword( "wagonhttp" ); server.setConnectors( new Connector[]{ connector } ); } } http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/2a129274/wagon-providers/wagon-webdav-jackrabbit/pom.xml ---------------------------------------------------------------------- diff --git a/wagon-providers/wagon-webdav-jackrabbit/pom.xml b/wagon-providers/wagon-webdav-jackrabbit/pom.xml index 4451a34..d34bfe9 100644 --- a/wagon-providers/wagon-webdav-jackrabbit/pom.xml +++ b/wagon-providers/wagon-webdav-jackrabbit/pom.xml @@ -54,12 +54,16 @@ under the License. <dependency> <groupId>org.apache.jackrabbit</groupId> <artifactId>jackrabbit-webdav</artifactId> - <version>2.5.2</version> + <version>2.14.1</version> <exclusions> <exclusion> <artifactId>commons-logging</artifactId> <groupId>commons-logging</groupId> </exclusion> + <exclusion> + <groupId>commons-httpclient</groupId> + <artifactId>commons-httpclient</artifactId> + </exclusion> </exclusions> </dependency> <dependency> @@ -83,21 +87,19 @@ under the License. </dependency> <dependency> - <groupId>commons-httpclient</groupId> - <artifactId>commons-httpclient</artifactId> - <version>3.1</version> - <!-- - The version of commons-logging that comes transitively has class loader - problems. So we exclude it here and add a newer version below. - Is replaced by org.slf4j:jcl-over-slf4j - --> + <groupId>org.apache.httpcomponents</groupId> + <artifactId>httpclient</artifactId> <exclusions> <exclusion> - <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> + <groupId>commons-logging</groupId> </exclusion> </exclusions> </dependency> + <dependency> + <groupId>org.apache.httpcomponents</groupId> + <artifactId>httpcore</artifactId> + </dependency> <!-- Test dependencies --> <dependency> @@ -145,25 +147,6 @@ under the License. </execution> </executions> </plugin> - <plugin><!-- Jackrabbit is compiled for JDK 6 --> - <artifactId>maven-enforcer-plugin</artifactId> - <executions> - <execution> - <id>enforce-bytecode-version</id> - <goals> - <goal>enforce</goal> - </goals> - <configuration> - <rules> - <enforceBytecodeVersion> - <maxJdkVersion>1.6</maxJdkVersion> - </enforceBytecodeVersion> - </rules> - <fail>true</fail> - </configuration> - </execution> - </executions> - </plugin> </plugins> </build> </project> http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/2a129274/wagon-providers/wagon-webdav-jackrabbit/src/main/java/org/apache/jackrabbit/webdav/client/methods/XmlRequestEntity.java ---------------------------------------------------------------------- diff --git a/wagon-providers/wagon-webdav-jackrabbit/src/main/java/org/apache/jackrabbit/webdav/client/methods/XmlRequestEntity.java b/wagon-providers/wagon-webdav-jackrabbit/src/main/java/org/apache/jackrabbit/webdav/client/methods/XmlRequestEntity.java index 094e114..24d44c6 100644 --- a/wagon-providers/wagon-webdav-jackrabbit/src/main/java/org/apache/jackrabbit/webdav/client/methods/XmlRequestEntity.java +++ b/wagon-providers/wagon-webdav-jackrabbit/src/main/java/org/apache/jackrabbit/webdav/client/methods/XmlRequestEntity.java @@ -19,10 +19,12 @@ package org.apache.jackrabbit.webdav.client.methods; * under the License. */ +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.apache.commons.httpclient.methods.RequestEntity; -import org.apache.commons.httpclient.methods.StringRequestEntity; import org.w3c.dom.Document; import java.io.OutputStream; @@ -38,14 +40,15 @@ import javax.xml.transform.stream.StreamResult; /** * <code>XmlRequestEntity</code>... + * @deprecated is it really use??? */ public class XmlRequestEntity - implements RequestEntity + extends HttpEntityEnclosingRequestBase { private static Logger log = LoggerFactory.getLogger( XmlRequestEntity.class ); - private final RequestEntity delegatee; + private final StringEntity delegatee; public XmlRequestEntity( Document xmlDocument ) throws IOException @@ -70,7 +73,7 @@ public class XmlRequestEntity throw exception; } - delegatee = new StringRequestEntity( out.toString(), "text/xml", "UTF-8" ); + delegatee = new StringEntity( out.toString(), "text/xml", "UTF-8" ); } public boolean isRepeatable() @@ -80,16 +83,22 @@ public class XmlRequestEntity public String getContentType() { - return delegatee.getContentType(); + return delegatee.getContentType().getValue(); } public void writeRequest( OutputStream out ) throws IOException { - delegatee.writeRequest( out ); + delegatee.writeTo( out ); } public long getContentLength() { return delegatee.getContentLength(); } + + @Override + public String getMethod() + { + return HttpPost.METHOD_NAME; + } } \ No newline at end of file