Author: maartenc
Date: Wed Oct  1 14:52:11 2008
New Revision: 700941

URL: http://svn.apache.org/viewvc?rev=700941&view=rev
Log:
FIX: Can't download files containing space or + in their names by HTTP (IVY-923)

Modified:
    ant/ivy/core/trunk/CHANGES.txt
    ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/AbstractURLHandler.java
    ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/BasicURLHandler.java
    ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/HttpClientHandler.java

Modified: ant/ivy/core/trunk/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/ant/ivy/core/trunk/CHANGES.txt?rev=700941&r1=700940&r2=700941&view=diff
==============================================================================
--- ant/ivy/core/trunk/CHANGES.txt (original)
+++ ant/ivy/core/trunk/CHANGES.txt Wed Oct  1 14:52:11 2008
@@ -98,6 +98,7 @@
 - FIX: Maven Pom reader doesn't handle optional dependencies correctly in some 
instances (IVY-926) (thanks to Phil Messenger)
 - FIX: ivy:settings doesn't work if id is a property (IVY-925)
 - FIX: HttpClientHandler hanging in certain cases (IVY-930) (thanks to Scott 
Hebert)
+- FIX: Can't download files containing space or + in their names by HTTP 
(IVY-923)
 
    2.0.0-rc1
 =====================================

Modified: 
ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/AbstractURLHandler.java
URL: 
http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/AbstractURLHandler.java?rev=700941&r1=700940&r2=700941&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/AbstractURLHandler.java 
(original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/AbstractURLHandler.java 
Wed Oct  1 14:52:11 2008
@@ -17,12 +17,18 @@
  */
 package org.apache.ivy.util.url;
 
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
 import java.net.URL;
 import java.net.HttpURLConnection;
+import java.util.regex.Pattern;
 import java.io.IOException;
 
 public abstract class AbstractURLHandler implements URLHandler {
     
+    private static final Pattern ESCAPE_PATTERN = 
Pattern.compile("%25([0-9a-fA-F][0-9a-fA-F])");
+
     // the request method to use. TODO: don't use a static here
     private static int requestMethod = REQUEST_METHOD_HEAD;
 
@@ -79,4 +85,38 @@
     public int getRequestMethod() {
         return requestMethod;
     }
+    
+    protected String normalizeToString(URL url) throws IOException {
+        if (!"http".equals(url.getProtocol()) && 
!"https".equals(url.getProtocol())) {
+            return url.toExternalForm();
+        }
+        
+        try {
+            URI uri = new URI(url.getProtocol(), url.getUserInfo(), 
url.getHost(), 
+                    url.getPort(), url.getPath(), url.getQuery(), 
url.getRef());
+            
+            // it is possible that the original url was already (partial) 
escaped,
+            // so we must unescape all '%' followed by 2 hexadecimals...
+            String uriString = uri.toString();
+            
+            // manually escape the '+' character
+            uriString = uriString.replaceAll("\\+", "%2B");
+            
+            return ESCAPE_PATTERN.matcher(uriString).replaceAll("%$1");
+        } catch (URISyntaxException e) {
+            IOException ioe = new MalformedURLException("Couldn't convert '" 
+                + url.toString() + "' to a valid URI"); 
+            ioe.initCause(e); 
+            throw ioe;
+        }
+    }
+    
+    protected URL normalizeToURL(URL url) throws IOException {
+        if (!"http".equals(url.getProtocol()) && 
!"https".equals(url.getProtocol())) {
+            return url;
+        }
+        
+        return new URL(normalizeToString(url));
+    }
+
 }

Modified: 
ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/BasicURLHandler.java
URL: 
http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/BasicURLHandler.java?rev=700941&r1=700940&r2=700941&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/BasicURLHandler.java 
(original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/BasicURLHandler.java 
Wed Oct  1 14:52:11 2008
@@ -25,13 +25,9 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.net.HttpURLConnection;
-import java.net.MalformedURLException;
-import java.net.URI;
-import java.net.URISyntaxException;
 import java.net.URL;
 import java.net.URLConnection;
 import java.net.UnknownHostException;
-import java.util.regex.Pattern;
 
 import org.apache.ivy.Ivy;
 import org.apache.ivy.util.CopyProgressListener;
@@ -42,8 +38,6 @@
  * 
  */
 public class BasicURLHandler extends AbstractURLHandler {
-    
-    private static final Pattern ESCAPE_PATTERN = 
Pattern.compile("%25([0-9a-fA-F][0-9a-fA-F])");
 
     private static final int BUFFER_SIZE = 64 * 1024;
 
@@ -70,7 +64,7 @@
     public URLInfo getURLInfo(URL url, int timeout) {
         URLConnection con = null;
         try {
-            url = normalize(url);
+            url = normalizeToURL(url);
             con = url.openConnection();
             con.setRequestProperty("User-Agent", "Apache Ivy/" + 
Ivy.getIvyVersion());
             if (con instanceof HttpURLConnection) {
@@ -101,26 +95,6 @@
         return UNAVAILABLE;
     }
 
-    private URL normalize(URL url) throws IOException {
-        if ("http".equals(url.getProtocol()) || 
"https".equals(url.getProtocol())) {
-            try { 
-                URI uri = new URI(url.getProtocol(), url.getUserInfo(), 
url.getHost(), 
-                        url.getPort(), url.getPath(), url.getQuery(), 
url.getRef());
-                
-                // it is possible that the original url was already (partial) 
escaped,
-                // so we must unescape all '%' followed by 2 hexadecimals...
-                String uriString = uri.toString();
-                url = new 
URL(ESCAPE_PATTERN.matcher(uriString).replaceAll("%$1"));
-            } catch (URISyntaxException e) {
-                IOException ioe = new MalformedURLException("Couldn't convert 
'" 
-                    + url.toString() + "' to a valid URI"); 
-                ioe.initCause(e); 
-                throw ioe;
-            }
-        }
-        return url;
-    }
-
     private boolean checkStatusCode(URL url, HttpURLConnection con) throws 
IOException {
         int status = con.getResponseCode();
         if (status == HttpStatus.SC_OK) {
@@ -143,7 +117,7 @@
         URLConnection conn = null;
         InputStream inStream = null;
         try {
-            url = normalize(url);
+            url = normalizeToURL(url);
             conn = url.openConnection();
             conn.setRequestProperty("User-Agent", "Apache Ivy/" + 
Ivy.getIvyVersion());
             if (conn instanceof HttpURLConnection) {
@@ -175,7 +149,7 @@
     public void download(URL src, File dest, CopyProgressListener l) throws 
IOException {
         URLConnection srcConn = null;
         try {
-            src = normalize(src);
+            src = normalizeToURL(src);
             srcConn = src.openConnection();
             srcConn.setRequestProperty("User-Agent", "Apache Ivy/" + 
Ivy.getIvyVersion());
             if (srcConn instanceof HttpURLConnection) {
@@ -211,7 +185,7 @@
 
         HttpURLConnection conn = null;
         try {
-            dest = normalize(dest);
+            dest = normalizeToURL(dest);
             conn = (HttpURLConnection) dest.openConnection();
             conn.setDoOutput(true);
             conn.setRequestMethod("PUT");

Modified: 
ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/HttpClientHandler.java
URL: 
http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/HttpClientHandler.java?rev=700941&r1=700940&r2=700941&view=diff
==============================================================================
--- ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/HttpClientHandler.java 
(original)
+++ ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/HttpClientHandler.java 
Wed Oct  1 14:52:11 2008
@@ -121,7 +121,7 @@
     public void upload(File src, URL dest, CopyProgressListener l) throws 
IOException {
         HttpClient client = getClient(dest);
 
-        PutMethod put = new PutMethod(dest.toExternalForm());
+        PutMethod put = new PutMethod(normalizeToString(dest));
         put.setDoAuthentication(useAuthentication(dest) || 
useProxyAuthentication());
         FileInputStream fileStream = null;
         try {
@@ -243,7 +243,7 @@
         HttpClient client = getClient(url);
         client.setTimeout(timeout);
 
-        GetMethod get = new GetMethod(url.toExternalForm());
+        GetMethod get = new GetMethod(normalizeToString(url));
         get.setDoAuthentication(useAuthentication(url) || 
useProxyAuthentication());
         client.executeMethod(get);
         return get;
@@ -253,7 +253,7 @@
         HttpClient client = getClient(url);
         client.setTimeout(timeout);
 
-        HeadMethod head = new HeadMethod(url.toExternalForm());
+        HeadMethod head = new HeadMethod(normalizeToString(url));
         head.setDoAuthentication(useAuthentication(url) || 
useProxyAuthentication());
         client.executeMethod(head);
         return head;


Reply via email to