From 03bc6a82ef011728a81c577d8d94aa80a1817374 Mon Sep 17 00:00:00 2001 From: Brett Porter Date: Sun, 27 Jul 2008 15:23:30 +0000 Subject: [PATCH] [MRM-884] network proxy doesn't work git-svn-id: https://svn.apache.org/repos/asf/archiva/trunk@680127 13f79535-47bb-0310-9956-ffa450edef68 --- .../archiva-base/archiva-proxy/pom.xml | 12 + .../DefaultRepositoryProxyConnectors.java | 24 +- .../archiva/proxy/AbstractProxyTestCase.java | 18 +- .../archiva/proxy/HttpProxyTransferTest.java | 210 ++++++++++++++++++ .../archiva/proxy/HttpProxyTransferTest.xml | 102 +++++++++ pom.xml | 2 +- 6 files changed, 347 insertions(+), 21 deletions(-) create mode 100644 archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/HttpProxyTransferTest.java create mode 100644 archiva-modules/archiva-base/archiva-proxy/src/test/resources/org/apache/maven/archiva/proxy/HttpProxyTransferTest.xml diff --git a/archiva-modules/archiva-base/archiva-proxy/pom.xml b/archiva-modules/archiva-base/archiva-proxy/pom.xml index b800c65a2..f4b39942a 100644 --- a/archiva-modules/archiva-base/archiva-proxy/pom.xml +++ b/archiva-modules/archiva-base/archiva-proxy/pom.xml @@ -72,6 +72,18 @@ xmlunit test + + org.mortbay.jetty + jetty + 6.1.11 + test + + + org.apache.maven.wagon + wagon-http-lightweight + ${wagon.version} + test + diff --git a/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/DefaultRepositoryProxyConnectors.java b/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/DefaultRepositoryProxyConnectors.java index 3604bc20b..f8cfca84f 100644 --- a/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/DefaultRepositoryProxyConnectors.java +++ b/archiva-modules/archiva-base/archiva-proxy/src/main/java/org/apache/maven/archiva/proxy/DefaultRepositoryProxyConnectors.java @@ -19,6 +19,17 @@ package org.apache.maven.archiva.proxy; * under the License. */ +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.Map.Entry; + import org.apache.commons.collections.CollectionUtils; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; @@ -65,17 +76,6 @@ import org.codehaus.plexus.util.SelectorUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Properties; - /** * DefaultRepositoryProxyConnectors * @@ -938,7 +938,7 @@ public class DefaultRepositoryProxyConnectors { boolean connected = false; - ProxyInfo networkProxy = null; + final ProxyInfo networkProxy; synchronized ( this.networkProxyMap ) { networkProxy = (ProxyInfo) this.networkProxyMap.get( connector.getProxyId() ); diff --git a/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/AbstractProxyTestCase.java b/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/AbstractProxyTestCase.java index e71ea65b0..344e5fc10 100644 --- a/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/AbstractProxyTestCase.java +++ b/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/AbstractProxyTestCase.java @@ -549,17 +549,19 @@ public abstract class AbstractProxyTestCase // This is just a warning. System.err.println( "[WARN] Skipping setup of testable managed repository, source dir does not exist: " + sourceDir ); - return; } - - // Test that the source is a dir. - if ( !sourceDir.isDirectory() ) + else { - fail( "Unable to setup testable managed repository, source is not a directory: " + sourceDir ); - } - // Copy directory structure. - copyDirectoryStructure( sourceDir, destDir ); + // Test that the source is a dir. + if ( !sourceDir.isDirectory() ) + { + fail( "Unable to setup testable managed repository, source is not a directory: " + sourceDir ); + } + + // Copy directory structure. + copyDirectoryStructure( sourceDir, destDir ); + } } protected void setManagedNewerThanRemote( File managedFile, File remoteFile ) diff --git a/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/HttpProxyTransferTest.java b/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/HttpProxyTransferTest.java new file mode 100644 index 000000000..63285c658 --- /dev/null +++ b/archiva-modules/archiva-base/archiva-proxy/src/test/java/org/apache/maven/archiva/proxy/HttpProxyTransferTest.java @@ -0,0 +1,210 @@ +package org.apache.maven.archiva.proxy; + +/* + * 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.io.File; +import java.io.IOException; +import java.util.Enumeration; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.io.FileUtils; +import org.apache.maven.archiva.configuration.ArchivaConfiguration; +import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration; +import org.apache.maven.archiva.configuration.NetworkProxyConfiguration; +import org.apache.maven.archiva.configuration.ProxyConnectorConfiguration; +import org.apache.maven.archiva.configuration.RemoteRepositoryConfiguration; +import org.apache.maven.archiva.model.ArtifactReference; +import org.apache.maven.archiva.policies.CachedFailuresPolicy; +import org.apache.maven.archiva.policies.ChecksumPolicy; +import org.apache.maven.archiva.policies.PropagateErrorsDownloadPolicy; +import org.apache.maven.archiva.policies.PropagateErrorsOnUpdateDownloadPolicy; +import org.apache.maven.archiva.policies.ReleasesPolicy; +import org.apache.maven.archiva.policies.SnapshotsPolicy; +import org.apache.maven.archiva.repository.ManagedRepositoryContent; +import org.codehaus.plexus.spring.PlexusInSpringTestCase; +import org.mortbay.jetty.Handler; +import org.mortbay.jetty.Request; +import org.mortbay.jetty.Server; +import org.mortbay.jetty.handler.AbstractHandler; + +/** + * Integration test for connecting over a HTTP proxy. + * + * @author Brett Porter + * @version $Id: ManagedDefaultTransferTest.java 677852 2008-07-18 08:16:24Z brett $ + */ +public class HttpProxyTransferTest + extends PlexusInSpringTestCase +{ + private static final String PROXY_ID = "proxy"; + + private static final String MANAGED_ID = "default-managed-repository"; + + private static final String PROXIED_ID = "proxied1"; + + private static final String PROXIED_BASEDIR = "src/test/repositories/proxied1"; + + private RepositoryProxyConnectors proxyHandler; + + private ArchivaConfiguration config; + + private ManagedRepositoryContent managedDefaultRepository; + + private Server server; + + @Override + protected void setUp() + throws Exception + { + super.setUp(); + + // Setup source repository (using default layout) + String repoPath = "target/test-repository/managed/" + getName(); + + File destRepoDir = new File( repoPath ); + + // Cleanout destination dirs. + if ( destRepoDir.exists() ) + { + FileUtils.deleteDirectory( destRepoDir ); + } + + // Make the destination dir. + destRepoDir.mkdirs(); + + ManagedRepositoryConfiguration repo = new ManagedRepositoryConfiguration(); + repo.setId( MANAGED_ID ); + repo.setName( "Default Managed Repository" ); + repo.setLocation( repoPath ); + repo.setLayout( "default" ); + + ManagedRepositoryContent repoContent = + (ManagedRepositoryContent) lookup( ManagedRepositoryContent.class, "default" ); + repoContent.setRepository( repo ); + managedDefaultRepository = repoContent; + + config = (MockConfiguration) lookup( ArchivaConfiguration.class.getName(), "mock" ); + config.getConfiguration().addManagedRepository( repo ); + + Handler handler = new AbstractHandler() + { + public void handle( String target, HttpServletRequest request, HttpServletResponse response, int dispatch ) + throws IOException, ServletException + { + response.setContentType( "text/plain" ); + response.setStatus( HttpServletResponse.SC_OK ); + response.getWriter().println( "get-default-layout-1.0.jar" ); + response.getWriter().println(); + assertNotNull( request.getHeader( "Proxy-Connection" ) ); + + ( (Request) request ).setHandled( true ); + } + }; + + server = new Server( 0 ); + server.setHandler( handler ); + server.start(); + + int port = server.getConnectors()[0].getLocalPort(); + + NetworkProxyConfiguration proxyConfig = new NetworkProxyConfiguration(); + proxyConfig.setHost( "localhost" ); + proxyConfig.setPort( port ); + proxyConfig.setProtocol( "http" ); + proxyConfig.setId( PROXY_ID ); + config.getConfiguration().addNetworkProxy( proxyConfig ); + + // Setup target (proxied to) repository. + RemoteRepositoryConfiguration repoConfig = new RemoteRepositoryConfiguration(); + + repoConfig.setId( PROXIED_ID ); + repoConfig.setName( "Proxied Repository 1" ); + repoConfig.setLayout( "default" ); + repoConfig.setUrl( "http://www.example.com/" ); + + config.getConfiguration().addRemoteRepository( repoConfig ); + + // Setup the proxy handler. + proxyHandler = (RepositoryProxyConnectors) lookup( RepositoryProxyConnectors.class.getName() ); + } + + @Override + protected void tearDown() + throws Exception + { + super.tearDown(); + + server.stop(); + } + + public void testGetOverHttpProxy() + throws Exception + { + String path = "org/apache/maven/test/get-default-layout/1.0/get-default-layout-1.0.jar"; + + // Configure Connector (usually done within archiva.xml configuration) + addConnector(); + + File expectedFile = new File( new File( managedDefaultRepository.getRepoRoot() ), path ); + ArtifactReference artifact = managedDefaultRepository.toArtifactReference( path ); + + // Attempt the proxy fetch. + File downloadedFile = proxyHandler.fetchFromProxies( managedDefaultRepository, artifact ); + + File sourceFile = new File( PROXIED_BASEDIR, path ); + assertNotNull( "Expected File should not be null.", expectedFile ); + assertNotNull( "Actual File should not be null.", downloadedFile ); + + assertTrue( "Check actual file exists.", downloadedFile.exists() ); + assertEquals( "Check filename path is appropriate.", expectedFile.getCanonicalPath(), + downloadedFile.getCanonicalPath() ); + assertEquals( "Check file path matches.", expectedFile.getAbsolutePath(), downloadedFile.getAbsolutePath() ); + + String expectedContents = FileUtils.readFileToString( sourceFile, null ); + String actualContents = FileUtils.readFileToString( downloadedFile, null ); + assertEquals( "Check file contents.", expectedContents, actualContents ); + } + + private void addConnector() + { + ProxyConnectorConfiguration connectorConfig = new ProxyConnectorConfiguration(); + connectorConfig.setProxyId( PROXY_ID ); + connectorConfig.setSourceRepoId( MANAGED_ID ); + connectorConfig.setTargetRepoId( PROXIED_ID ); + connectorConfig.addPolicy( ProxyConnectorConfiguration.POLICY_CHECKSUM, ChecksumPolicy.FIX ); + connectorConfig.addPolicy( ProxyConnectorConfiguration.POLICY_RELEASES, ReleasesPolicy.ONCE ); + connectorConfig.addPolicy( ProxyConnectorConfiguration.POLICY_SNAPSHOTS, SnapshotsPolicy.ONCE ); + connectorConfig.addPolicy( ProxyConnectorConfiguration.POLICY_CACHE_FAILURES, CachedFailuresPolicy.NO ); + connectorConfig.addPolicy( ProxyConnectorConfiguration.POLICY_PROPAGATE_ERRORS, + PropagateErrorsDownloadPolicy.QUEUE ); + connectorConfig.addPolicy( ProxyConnectorConfiguration.POLICY_PROPAGATE_ERRORS_ON_UPDATE, + PropagateErrorsOnUpdateDownloadPolicy.NOT_PRESENT ); + + int count = config.getConfiguration().getProxyConnectors().size(); + config.getConfiguration().addProxyConnector( connectorConfig ); + + // Proper Triggering ... + String prefix = "proxyConnectors.proxyConnector(" + count + ")"; + ( (MockConfiguration) config ).triggerChange( prefix + ".sourceRepoId", connectorConfig.getSourceRepoId() ); + } +} diff --git a/archiva-modules/archiva-base/archiva-proxy/src/test/resources/org/apache/maven/archiva/proxy/HttpProxyTransferTest.xml b/archiva-modules/archiva-base/archiva-proxy/src/test/resources/org/apache/maven/archiva/proxy/HttpProxyTransferTest.xml new file mode 100644 index 000000000..9c3909d62 --- /dev/null +++ b/archiva-modules/archiva-base/archiva-proxy/src/test/resources/org/apache/maven/archiva/proxy/HttpProxyTransferTest.xml @@ -0,0 +1,102 @@ + + + + + + org.apache.maven.archiva.configuration.ArchivaConfiguration + mock + org.apache.maven.archiva.proxy.MockConfiguration + + + org.apache.maven.archiva.repository.RepositoryContentFactory + mocked + org.apache.maven.archiva.repository.RepositoryContentFactory + RepositoryContentRequest + + + org.apache.maven.archiva.configuration.ArchivaConfiguration + mock + archivaConfiguration + + + + + org.apache.maven.archiva.proxy.RepositoryProxyConnectors + default + org.apache.maven.archiva.proxy.DefaultRepositoryProxyConnectors + DefaultRepositoryProxyConnectors + + + org.apache.maven.archiva.configuration.ArchivaConfiguration + mock + archivaConfiguration + + + org.apache.maven.wagon.Wagon + wagons + + + org.apache.maven.archiva.repository.RepositoryContentFactory + mocked + + + org.apache.maven.archiva.repository.metadata.MetadataTools + + + org.apache.maven.archiva.policies.PreDownloadPolicy + preDownloadPolicies + + + org.apache.maven.archiva.policies.PostDownloadPolicy + postDownloadPolicies + + + org.apache.maven.archiva.repository.scanner.RepositoryContentConsumers + consumers + + + org.apache.maven.archiva.policies.urlcache.UrlFailureCache + urlFailureCache + + + + + + org.codehaus.plexus.cache.Cache + url-failures-cache + org.codehaus.plexus.cache.ehcache.EhcacheCache + URL Failure Cache + + 600 + false + ${java.io.tmpdir}/archiva/urlcache + false + 1000 + LRU + url-failures-cache + false + + 2700 + + 1800 + + + + diff --git a/pom.xml b/pom.xml index d3f439c5b..284e85b82 100644 --- a/pom.xml +++ b/pom.xml @@ -951,7 +951,7 @@ 2.0.8 - 1.0-beta-3 + 1.0-SNAPSHOT 1.0.3-SNAPSHOT 6.1.6 -- 2.39.5