Repository: maven-wagon
Updated Branches:
  refs/heads/master 327947eb0 -> 479f7bea6


[WAGON-427] added support for IPv6
Submitted by: genadi-hp
Applied with little style modifications

Project: http://git-wip-us.apache.org/repos/asf/maven-wagon/repo
Commit: http://git-wip-us.apache.org/repos/asf/maven-wagon/commit/479f7bea
Tree: http://git-wip-us.apache.org/repos/asf/maven-wagon/tree/479f7bea
Diff: http://git-wip-us.apache.org/repos/asf/maven-wagon/diff/479f7bea

Branch: refs/heads/master
Commit: 479f7bea6ff1f315bf3372e3f9eb7a9ef88e3e52
Parents: 327947e
Author: Hervé Boutemy <[email protected]>
Authored: Sun Mar 22 14:38:37 2015 +0100
Committer: Hervé Boutemy <[email protected]>
Committed: Sun Mar 22 14:38:37 2015 +0100

----------------------------------------------------------------------
 .../java/org/apache/maven/wagon/PathUtils.java  | 33 +++++-----
 .../maven/wagon/repository/Repository.java      | 21 +++++-
 .../org/apache/maven/wagon/PathUtilsTest.java   | 69 ++++++++++++++------
 .../maven/wagon/repository/RepositoryTest.java  | 56 ++++++++++++++++
 4 files changed, 140 insertions(+), 39 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/479f7bea/wagon-provider-api/src/main/java/org/apache/maven/wagon/PathUtils.java
----------------------------------------------------------------------
diff --git 
a/wagon-provider-api/src/main/java/org/apache/maven/wagon/PathUtils.java 
b/wagon-provider-api/src/main/java/org/apache/maven/wagon/PathUtils.java
index 32180ce..e77e03a 100644
--- a/wagon-provider-api/src/main/java/org/apache/maven/wagon/PathUtils.java
+++ b/wagon-provider-api/src/main/java/org/apache/maven/wagon/PathUtils.java
@@ -33,7 +33,7 @@ public final class PathUtils
     private PathUtils()
     {
     }
-    
+
     /**
      * Returns the directory path portion of a file specification string.
      * Matches the equally named unix command.
@@ -135,14 +135,12 @@ public final class PathUtils
     {
         String authorization = authorization( url );
         int index = authorization.indexOf( '@' );
-        if ( index >= 0 )
-        {
-            return authorization.substring( index + 1 );
-        }
-        else
-        {
-            return authorization;
-        }
+        String host = ( index >= 0 ) ? authorization.substring( index + 1 ) : 
authorization;
+        // In case we have IPv6 in the host portion of url
+        // we have to remove brackets '[' and ']'
+        return ( ( host.charAt( 0 ) == '[' ) && ( host.charAt( host.length() - 
1 ) == ']' ) )
+                        ? host.substring( 1, host.length() - 1 )
+                        : host;
     }
 
     /**
@@ -185,14 +183,7 @@ public final class PathUtils
 
         pos = host.indexOf( '@' );
 
-        if ( pos > 0 )
-        {
-            pos = host.indexOf( ':', pos );
-        }
-        else
-        {
-            pos = host.indexOf( ":" );
-        }
+        pos = ( pos > 0 ) ? endOfHostPosition( host, pos ) : 
endOfHostPosition( host, 0 );
 
         if ( pos > 0 )
         {
@@ -201,6 +192,14 @@ public final class PathUtils
         return host;
     }
 
+    private static int endOfHostPosition( String host, int pos )
+    {
+        // if this is IPv6 then it will be in IPv6 Literal Addresses in URL's 
format
+        // see: http://www.ietf.org/rfc/rfc2732.txt
+        int endOfIPv6Pos = host.indexOf( ']', pos );
+        return ( endOfIPv6Pos > 0 ) ? endOfIPv6Pos + 1 : host.indexOf( ":", 
pos );
+    }
+
     /**
      * /**
      * Return the protocol name.

http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/479f7bea/wagon-provider-api/src/main/java/org/apache/maven/wagon/repository/Repository.java
----------------------------------------------------------------------
diff --git 
a/wagon-provider-api/src/main/java/org/apache/maven/wagon/repository/Repository.java
 
b/wagon-provider-api/src/main/java/org/apache/maven/wagon/repository/Repository.java
index 6c9ce8d..b28dd1a 100644
--- 
a/wagon-provider-api/src/main/java/org/apache/maven/wagon/repository/Repository.java
+++ 
b/wagon-provider-api/src/main/java/org/apache/maven/wagon/repository/Repository.java
@@ -182,7 +182,16 @@ public class Repository
 
         sb.append( "://" );
 
-        sb.append( host );
+        if ( isIPv6Address() )
+        {
+            // If this is IPv6 then we have to surround it
+            // with brackets '[' and ']'
+            sb.append( "[" ).append( getHost() ).append( "]" );
+        }
+        else
+        {
+            sb.append( getHost() );
+        }
 
         if ( port != WagonConstants.UNKNOWN_PORT )
         {
@@ -196,6 +205,16 @@ public class Repository
         return sb.toString();
     }
 
+    /**
+     * Checks whtther provided url contains IPv6 format in host portion
+     * 
+     * @return true if provide host part is of IPv6 format
+     */
+    private boolean isIPv6Address()
+    {
+        return getHost().contains( ":" );
+    }
+
     public String getHost()
     {
         if ( host == null )

http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/479f7bea/wagon-provider-api/src/test/java/org/apache/maven/wagon/PathUtilsTest.java
----------------------------------------------------------------------
diff --git 
a/wagon-provider-api/src/test/java/org/apache/maven/wagon/PathUtilsTest.java 
b/wagon-provider-api/src/test/java/org/apache/maven/wagon/PathUtilsTest.java
index 48c5bd4..0f09202 100644
--- a/wagon-provider-api/src/test/java/org/apache/maven/wagon/PathUtilsTest.java
+++ b/wagon-provider-api/src/test/java/org/apache/maven/wagon/PathUtilsTest.java
@@ -154,7 +154,7 @@ public class PathUtilsTest
     public void testFileBasedir()
     {
         // see http://www.mozilla.org/quality/networking/testing/filetests.html
-        
+
         // strict forms
         assertEquals( "c:/temp", PathUtils.basedir( "file:///c|/temp" ) );
         assertEquals( "localhost", PathUtils.host( "file:///c|/temp" ) );
@@ -255,26 +255,53 @@ public class PathUtilsTest
 
     public void testIpV4()
     {
-        assertUrl( "http://127.0.0.1";,
-                   "http", null, null, "127.0.0.1", -1, "/" );
-        assertUrl( "http://127.0.0.1:8080";,
-                   "http", null, null, "127.0.0.1", 8080, "/" );
-        assertUrl( "http://127.0.0.1/oo/rest/users";,
-                   "http", null, null, "127.0.0.1", -1, "/oo/rest/users" );
-        assertUrl( "http://127.0.0.1:8080/oo/rest/users";,
-                   "http", null, null, "127.0.0.1", 8080, "/oo/rest/users" );
-
-        assertUrl( "http://user:[email protected]";,
-                   "http", "user", "password", "127.0.0.1", -1, "/" );
-        assertUrl( "http://user:[email protected]:8080";,
-                   "http", "user", "password", "127.0.0.1", 8080, "/" );
-        assertUrl( "http://user:[email protected]/oo/rest/users";,
-                   "http", "user", "password", "127.0.0.1", -1, 
"/oo/rest/users" );
-        assertUrl( "http://user:[email protected]:8080/oo/rest/users";,
-                   "http", "user", "password", "127.0.0.1", 8080, 
"/oo/rest/users" );
-
-        assertUrl( "scm:svn:http://user:[email protected]:8080/oo/rest/users";,
-                   "scm", "user", "password", "127.0.0.1", 8080, 
"/oo/rest/users" );
+        assertUrl( "http://127.0.0.1";, "http", null, null, "127.0.0.1", -1, 
"/" );
+        assertUrl( "http://127.0.0.1:8080";, "http", null, null, "127.0.0.1", 
8080, "/" );
+        assertUrl( "http://127.0.0.1/oo/rest/users";, "http", null, null, 
"127.0.0.1", -1, "/oo/rest/users" );
+        assertUrl( "http://127.0.0.1:8080/oo/rest/users";, "http", null, null, 
"127.0.0.1", 8080, "/oo/rest/users" );
+
+        assertUrl( "http://user:[email protected]";, "http", "user", 
"password", "127.0.0.1", -1, "/" );
+        assertUrl( "http://user:[email protected]:8080";, "http", "user", 
"password", "127.0.0.1", 8080, "/" );
+        assertUrl( "http://user:[email protected]/oo/rest/users";, "http", 
"user", "password", "127.0.0.1", -1,
+                   "/oo/rest/users" );
+        assertUrl( "http://user:[email protected]:8080/oo/rest/users";, 
"http", "user", "password", "127.0.0.1", 8080,
+                   "/oo/rest/users" );
+
+        assertUrl( 
"scm:svn:http://user:[email protected]:8080/oo/rest/users";, "scm", "user", 
"password", "127.0.0.1",
+                   8080, "/oo/rest/users" );
+    }
+
+    public void testIPv6()
+    {
+        assertUrl( "http://user:password@[fff:::1]:7891/oo/rest/users";, 
"http", "user", "password", "fff:::1", 7891,
+                   "/oo/rest/users" );
+        assertUrl( "http://[fff:::1]:7891/oo/rest/users";, "http", null, null, 
"fff:::1", 7891, "/oo/rest/users" );
+        assertUrl( "http://user:password@[fff:::1]/oo/rest/users";, "http", 
"user", "password", "fff:::1", -1,
+                   "/oo/rest/users" );
+        assertUrl( "http://user:password@[fff:::1]:7891";, "http", "user", 
"password", "fff:::1", 7891, "/" );
+
+        assertUrl( 
"http://user:password@[fff:000::222:1111]:7891/oo/rest/users";, "http", "user", 
"password",
+                   "fff:000::222:1111", 7891, "/oo/rest/users" );
+        assertUrl( "http://[fff:000::222:1111]:7891/oo/rest/users";, "http", 
null, null, "fff:000::222:1111", 7891,
+                   "/oo/rest/users" );
+        assertUrl( "http://user:password@[fff:000::222:1111]/oo/rest/users";, 
"http", "user", "password",
+                   "fff:000::222:1111", -1, "/oo/rest/users" );
+        assertUrl( "http://user:password@[fff:000::222:1111]:7891";, "http", 
"user", "password", "fff:000::222:1111",
+                   7891, "/" );
+
+        assertUrl( "http://user:[email protected]:7891/oo/rest/users";, 
"http", "user", "password", "16.60.56.58",
+                   7891, "/oo/rest/users" );
+        assertUrl( "http://16.60.56.58:7891/oo/rest/users";, "http", null, 
null, "16.60.56.58", 7891, "/oo/rest/users" );
+        assertUrl( "http://user:[email protected]/oo/rest/users";, "http", 
"user", "password", "16.60.56.58", -1,
+                   "/oo/rest/users" );
+        assertUrl( "http://user:[email protected]:7891";, "http", "user", 
"password", "16.60.56.58", 7891, "/" );
+
+        assertUrl( "http://user:[email protected]:7891/oo/rest/users";, 
"http", "user", "password", "16.60.56.58",
+                   7891, "/oo/rest/users" );
+        assertUrl( "http://16.60.56.58:7891/oo/rest/users";, "http", null, 
null, "16.60.56.58", 7891, "/oo/rest/users" );
+        assertUrl( "http://user:[email protected]/oo/rest/users";, "http", 
"user", "password", "16.60.56.58", -1,
+                   "/oo/rest/users" );
+        assertUrl( "http://user:[email protected]:7891";, "http", "user", 
"password", "16.60.56.58", 7891, "/" );
     }
 
     private void assertUrl( String url, String protocol, String user, String 
password, String host, int port,

http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/479f7bea/wagon-provider-api/src/test/java/org/apache/maven/wagon/repository/RepositoryTest.java
----------------------------------------------------------------------
diff --git 
a/wagon-provider-api/src/test/java/org/apache/maven/wagon/repository/RepositoryTest.java
 
b/wagon-provider-api/src/test/java/org/apache/maven/wagon/repository/RepositoryTest.java
index 2495728..bb85df0 100644
--- 
a/wagon-provider-api/src/test/java/org/apache/maven/wagon/repository/RepositoryTest.java
+++ 
b/wagon-provider-api/src/test/java/org/apache/maven/wagon/repository/RepositoryTest.java
@@ -105,4 +105,60 @@ public class RepositoryTest
         assertEquals( "http://www.ibiblio.org";, repository.getUrl() );
 
     }
+
+    public void testIPv6()
+    {
+        assertRepository( "http://user:password@[fff:::1]:7891/oo/rest/users";, 
"http://[fff:::1]:7891/oo/rest/users";,
+                          "/oo/rest/users", "user", "password", "fff:::1", 
7891 );
+        assertRepository( "http://[fff:::1]:7891/oo/rest/users";, 
"http://[fff:::1]:7891/oo/rest/users";,
+                          "/oo/rest/users", null, null, "fff:::1", 7891 );
+        assertRepository( "http://user:password@[fff:::1]/oo/rest/users";, 
"http://[fff:::1]/oo/rest/users";,
+                          "/oo/rest/users", "user", "password", "fff:::1", -1 
);
+        assertRepository( "http://user:password@[fff:::1]:7891";, 
"http://[fff:::1]:7891";, "/", "user", "password",
+                          "fff:::1", 7891 );
+
+        assertRepository( 
"http://user:password@[fff:000::222:1111]:7891/oo/rest/users";,
+                          "http://[fff:000::222:1111]:7891/oo/rest/users";, 
"/oo/rest/users", "user", "password",
+                          "fff:000::222:1111", 7891 );
+        assertRepository( "http://[fff:000::222:1111]:7891/oo/rest/users";,
+                          "http://[fff:000::222:1111]:7891/oo/rest/users";, 
"/oo/rest/users", null, null,
+                          "fff:000::222:1111", 7891 );
+        assertRepository( 
"http://user:password@[fff:000::222:1111]/oo/rest/users";,
+                          "http://[fff:000::222:1111]/oo/rest/users";, 
"/oo/rest/users", "user", "password",
+                          "fff:000::222:1111", -1 );
+        assertRepository( "http://user:password@[fff:000::222:1111]:7891";, 
"http://[fff:000::222:1111]:7891";, "/",
+                          "user", "password", "fff:000::222:1111", 7891 );
+
+        assertRepository( 
"http://user:[email protected]:7891/oo/rest/users";,
+                          "http://16.60.56.58:7891/oo/rest/users";, 
"/oo/rest/users", "user", "password", "16.60.56.58",
+                          7891 );
+        assertRepository( "http://16.60.56.58:7891/oo/rest/users";, 
"http://16.60.56.58:7891/oo/rest/users";,
+                          "/oo/rest/users", null, null, "16.60.56.58", 7891 );
+        assertRepository( "http://user:[email protected]/oo/rest/users";, 
"http://16.60.56.58/oo/rest/users";,
+                          "/oo/rest/users", "user", "password", "16.60.56.58", 
-1 );
+        assertRepository( "http://user:[email protected]:7891";, 
"http://16.60.56.58:7891";, "/", "user", "password",
+                          "16.60.56.58", 7891 );
+
+        assertRepository( 
"http://user:[email protected]:7891/oo/rest/users";,
+                          "http://16.60.56.58:7891/oo/rest/users";, 
"/oo/rest/users", "user", "password", "16.60.56.58",
+                          7891 );
+        assertRepository( "http://16.60.56.58:7891/oo/rest/users";, 
"http://16.60.56.58:7891/oo/rest/users";,
+                          "/oo/rest/users", null, null, "16.60.56.58", 7891 );
+        assertRepository( "http://user:[email protected]/oo/rest/users";, 
"http://16.60.56.58/oo/rest/users";,
+                          "/oo/rest/users", "user", "password", "16.60.56.58", 
-1 );
+        assertRepository( "http://user:[email protected]:7891";, 
"http://16.60.56.58:7891";, "/", "user", "password",
+                          "16.60.56.58", 7891 );
+    }
+
+    private void assertRepository( String url, String repoUrl, String baseDir, 
String user, String password,
+                                   String host, int port )
+    {
+        Repository repo = new Repository( String.valueOf( 
System.currentTimeMillis() ), url );
+        assertEquals( repoUrl, repo.getUrl() );
+        assertEquals( baseDir, repo.getBasedir() );
+        assertEquals( host, repo.getHost() );
+        assertEquals( user, repo.getUsername() );
+        assertEquals( password, repo.getPassword() );
+        assertEquals( port, repo.getPort() );
+    }
 }

Reply via email to