Repository: maven-wagon Updated Branches: refs/heads/master 70474a05d -> 824adca8d
make sure User-Agent header is sent exactly once - remove unnecessary explicit default User-Agent (all 3 HTTP wagon providers [http, lightweight, webdav] send a User-Agent by default already) - when adding headers, use setHeader() instead of addHeader(). this will avoid sending the same header key multiple times - adapt header listener in tests so it will detect header keys sent multiple times - add tests to make sure default User-Agent is always present and User-Agent is present only once even if set multiple times using different methods Signed-off-by: Jan Sievers <jan.siev...@sap.com> Signed-off-by: Jason van Zyl <jvan...@apache.org> Project: http://git-wip-us.apache.org/repos/asf/maven-wagon/repo Commit: http://git-wip-us.apache.org/repos/asf/maven-wagon/commit/824adca8 Tree: http://git-wip-us.apache.org/repos/asf/maven-wagon/tree/824adca8 Diff: http://git-wip-us.apache.org/repos/asf/maven-wagon/diff/824adca8 Branch: refs/heads/master Commit: 824adca8df1e36bc8b8cc9267f5e3a3a93cdef44 Parents: 70474a0 Author: Jan Sievers <jan.siev...@sap.com> Authored: Fri Apr 17 14:31:46 2015 +0200 Committer: Jason van Zyl <jvan...@apache.org> Committed: Fri Apr 17 10:02:24 2015 -0400 ---------------------------------------------------------------------- .../maven/wagon/http/HttpWagonTestCase.java | 65 +++++++++++++++++++- .../providers/http/AbstractHttpClientWagon.java | 34 +--------- 2 files changed, 66 insertions(+), 33 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/824adca8/wagon-provider-test/src/main/java/org/apache/maven/wagon/http/HttpWagonTestCase.java ---------------------------------------------------------------------- diff --git a/wagon-provider-test/src/main/java/org/apache/maven/wagon/http/HttpWagonTestCase.java b/wagon-provider-test/src/main/java/org/apache/maven/wagon/http/HttpWagonTestCase.java index 8657020..acdab16 100644 --- a/wagon-provider-test/src/main/java/org/apache/maven/wagon/http/HttpWagonTestCase.java +++ b/wagon-provider-test/src/main/java/org/apache/maven/wagon/http/HttpWagonTestCase.java @@ -207,6 +207,56 @@ public abstract class HttpWagonTestCase assertEquals( "Maven-Wagon/1.0", handler.headers.get( "User-Agent" ) ); } + public void testUserAgentHeaderIsPresentByDefault() + throws Exception + { + StreamingWagon wagon = (StreamingWagon) getWagon(); + Server server = new Server( 0 ); + TestHeaderHandler handler = new TestHeaderHandler(); + server.setHandler( handler ); + addConnectors( server ); + server.start(); + wagon.connect( new Repository( "id", getProtocol() + "://localhost:" + + server.getConnectors()[0].getLocalPort() ) ); + wagon.getToStream( "resource", new ByteArrayOutputStream() ); + wagon.disconnect(); + server.stop(); + + assertNotNull( "default User-Agent header of wagon provider should be present", + handler.headers.get( "User-Agent" ) ); + } + + public void testUserAgentHeaderIsPresentOnlyOnceIfSetMultipleTimes() + throws Exception + { + StreamingWagon wagon = (StreamingWagon) getWagon(); + + // 1. set User-Agent header via HttpConfiguration + Properties headers1 = new Properties(); + headers1.setProperty( "User-Agent", "test-user-agent" ); + setHttpHeaders( wagon, headers1 ); + + // 2. redundantly set User-Agent header via setHttpHeaders() + Properties headers2 = new Properties(); + headers2.setProperty( "User-Agent", "test-user-agent" ); + Method setHttpHeaders = wagon.getClass().getMethod( "setHttpHeaders", Properties.class ); + setHttpHeaders.invoke( wagon, headers2 ); + + Server server = new Server( 0 ); + TestHeaderHandler handler = new TestHeaderHandler(); + server.setHandler( handler ); + addConnectors( server ); + server.start(); + wagon.connect( new Repository( "id", getProtocol() + "://localhost:" + + server.getConnectors()[0].getLocalPort() ) ); + wagon.getToStream( "resource", new ByteArrayOutputStream() ); + wagon.disconnect(); + server.stop(); + + assertEquals( "test-user-agent", handler.headers.get( "User-Agent" ) ); + + } + protected abstract void setHttpHeaders( StreamingWagon wagon, Properties properties ); protected void addConnectors( Server server ) @@ -2011,7 +2061,20 @@ public abstract class HttpWagonTestCase for ( Enumeration<String> e = request.getHeaderNames(); e.hasMoreElements(); ) { String name = e.nextElement(); - headers.put( name, request.getHeader( name ) ); + Enumeration headerValues = request.getHeaders( name ); + // as per HTTP spec http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html + // multiple values for the same header key are concatenated separated by comma + // otherwise we wouldn't notice headers with same key added multiple times + StringBuffer combinedHeaderValue = new StringBuffer(); + for ( int i = 0; headerValues.hasMoreElements(); i++ ) + { + if ( i > 0 ) + { + combinedHeaderValue.append( "," ); + } + combinedHeaderValue.append( headerValues.nextElement() ); + } + headers.put( name, combinedHeaderValue.toString() ); } response.setContentType( "text/plain" ); http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/824adca8/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 index e270c20..f47e5ae 100755 --- 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 @@ -375,35 +375,6 @@ public abstract class AbstractHttpClientWagon .build(); } - private static final String DEFAULT_USER_AGENT = getDefaultUserAgent(); - - private static String getDefaultUserAgent() - { - Properties props = new Properties(); - - InputStream is = AbstractHttpClientWagon.class.getResourceAsStream( - "/META-INF/maven/org.apache.maven.wagon/wagon-http/pom.properties" ); - if ( is != null ) - { - try - { - props.load( is ); - } - catch ( IOException ignore ) - { - // ignore - } - finally - { - IOUtil.close( is ); - } - } - - String ver = props.getProperty( "version", "unknown-version" ); - return "Apache-Maven-Wagon/" + ver + " (Java " + System.getProperty( "java.version" ) + "; "; - } - - private CredentialsProvider credentialsProvider; private AuthCache authCache; @@ -873,14 +844,13 @@ public abstract class AbstractHttpClientWagon method.addHeader( "Pragma", "no-cache" ); method.addHeader( "Expires", "0" ); method.addHeader( "Accept-Encoding", "gzip" ); - method.addHeader( "User-Agent", DEFAULT_USER_AGENT ); } if ( httpHeaders != null ) { for ( Map.Entry<Object, Object> entry : httpHeaders.entrySet() ) { - method.addHeader( (String) entry.getKey(), (String) entry.getValue() ); + method.setHeader( (String) entry.getKey(), (String) entry.getValue() ); } } @@ -889,7 +859,7 @@ public abstract class AbstractHttpClientWagon { for ( Header header : headers ) { - method.addHeader( header ); + method.setHeader( header ); } } }