You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2015/04/18 12:31:15 UTC

svn commit: r1674480 - in /httpcomponents/httpclient/trunk/httpclient/src: main/java/org/apache/http/client/utils/URIUtils.java test/java/org/apache/http/client/utils/TestURIUtils.java

Author: olegk
Date: Sat Apr 18 10:31:15 2015
New Revision: 1674480

URL: http://svn.apache.org/r1674480
Log:
HTTPCLIENT-1641: cleaner and more efficient implementation of URIUtils#normalizeSyntax

Modified:
    httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/utils/URIUtils.java
    httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/client/utils/TestURIUtils.java

Modified: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/utils/URIUtils.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/utils/URIUtils.java?rev=1674480&r1=1674479&r2=1674480&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/utils/URIUtils.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/utils/URIUtils.java Sat Apr 18 10:31:15 2015
@@ -238,7 +238,7 @@ public class URIUtils {
      * @return the resulting URI
      */
     public static URI resolve(final URI baseURI, final String reference) {
-        return URIUtils.resolve(baseURI, URI.create(reference));
+        return resolve(baseURI, URI.create(reference));
     }
 
     /**
@@ -252,37 +252,27 @@ public class URIUtils {
     public static URI resolve(final URI baseURI, final URI reference){
         Args.notNull(baseURI, "Base URI");
         Args.notNull(reference, "Reference URI");
-        URI ref = reference;
-        final String s = ref.toString();
+        final String s = reference.toASCIIString();
         if (s.startsWith("?")) {
-            return resolveReferenceStartingWithQueryString(baseURI, ref);
+            String baseUri = baseURI.toASCIIString();
+            final int i = baseUri.indexOf('?');
+            baseUri = i > -1 ? baseUri.substring(0, i) : baseUri;
+            return URI.create(baseUri + s);
         }
         final boolean emptyReference = s.isEmpty();
+        URI resolved;
         if (emptyReference) {
-            ref = URI.create("#");
+            resolved = baseURI.resolve(URI.create("#"));
+            final String resolvedString = resolved.toASCIIString();
+            resolved = URI.create(resolvedString.substring(0, resolvedString.indexOf('#')));
+        } else {
+            resolved = baseURI.resolve(reference);
         }
-        URI resolved = baseURI.resolve(ref);
-        if (emptyReference) {
-            final String resolvedString = resolved.toString();
-            resolved = URI.create(resolvedString.substring(0,
-                resolvedString.indexOf('#')));
+        try {
+            return normalizeSyntax(resolved);
+        } catch (URISyntaxException ex) {
+            throw new IllegalArgumentException(ex);
         }
-        return normalizeSyntax(resolved);
-    }
-
-    /**
-     * Resolves a reference starting with a query string.
-     *
-     * @param baseURI the base URI
-     * @param reference the URI reference starting with a query string
-     * @return the resulting URI
-     */
-    private static URI resolveReferenceStartingWithQueryString(
-            final URI baseURI, final URI reference) {
-        String baseUri = baseURI.toString();
-        baseUri = baseUri.indexOf('?') > -1 ?
-            baseUri.substring(0, baseUri.indexOf('?')) : baseUri;
-        return URI.create(baseUri + reference.toString());
     }
 
     /**
@@ -292,57 +282,45 @@ public class URIUtils {
      * @param uri the original URI
      * @return the URI without dot segments
      */
-    private static URI normalizeSyntax(final URI uri) {
+    static URI normalizeSyntax(final URI uri) throws URISyntaxException {
         if (uri.isOpaque() || uri.getAuthority() == null) {
             // opaque and file: URIs
             return uri;
         }
         Args.check(uri.isAbsolute(), "Base URI must be absolute");
-        final String path = uri.getPath() == null ? "" : uri.getPath();
-        final String[] inputSegments = path.split("/");
-        final Stack<String> outputSegments = new Stack<String>();
-        for (final String inputSegment : inputSegments) {
-            if ((inputSegment.isEmpty())
-                || (".".equals(inputSegment))) {
-                // Do nothing
-            } else if ("..".equals(inputSegment)) {
-                if (!outputSegments.isEmpty()) {
-                    outputSegments.pop();
+        final URIBuilder builder = new URIBuilder(uri);
+        final String path = builder.getPath();
+        if (path != null && !path.equals("/")) {
+            final String[] inputSegments = path.split("/");
+            final Stack<String> outputSegments = new Stack<String>();
+            for (final String inputSegment : inputSegments) {
+                if ((inputSegment.isEmpty()) || (".".equals(inputSegment))) {
+                    // Do nothing
+                } else if ("..".equals(inputSegment)) {
+                    if (!outputSegments.isEmpty()) {
+                        outputSegments.pop();
+                    }
+                } else {
+                    outputSegments.push(inputSegment);
                 }
-            } else {
-                outputSegments.push(inputSegment);
             }
-        }
-        final StringBuilder outputBuffer = new StringBuilder();
-        for (final String outputSegment : outputSegments) {
-            outputBuffer.append('/').append(outputSegment);
-        }
-        if (path.lastIndexOf('/') == path.length() - 1) {
-            // path.endsWith("/") || path.equals("")
-            outputBuffer.append('/');
-        }
-        try {
-            final String scheme = uri.getScheme().toLowerCase(Locale.ROOT);
-            final String auth = uri.getAuthority().toLowerCase(Locale.ROOT);
-            final URI ref = new URI(scheme, auth, outputBuffer.toString(),
-                    null, null);
-            if (uri.getQuery() == null && uri.getFragment() == null) {
-                return ref;
+            final StringBuilder outputBuffer = new StringBuilder();
+            for (final String outputSegment : outputSegments) {
+                outputBuffer.append('/').append(outputSegment);
             }
-            final StringBuilder normalized = new StringBuilder(
-                    ref.toASCIIString());
-            if (uri.getQuery() != null) {
-                // query string passed through unchanged
-                normalized.append('?').append(uri.getRawQuery());
+            if (path.lastIndexOf('/') == path.length() - 1) {
+                // path.endsWith("/") || path.equals("")
+                outputBuffer.append('/');
             }
-            if (uri.getFragment() != null) {
-                // fragment passed through unchanged
-                normalized.append('#').append(uri.getRawFragment());
-            }
-            return URI.create(normalized.toString());
-        } catch (final URISyntaxException e) {
-            throw new IllegalArgumentException(e);
+            builder.setPath(outputBuffer.toString());
+        }
+        if (builder.getScheme() != null) {
+            builder.setScheme(builder.getScheme().toLowerCase(Locale.ROOT));
+        }
+        if (builder.getHost() != null) {
+            builder.setHost(builder.getHost().toLowerCase(Locale.ROOT));
         }
+        return builder.build();
     }
 
     /**

Modified: httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/client/utils/TestURIUtils.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/client/utils/TestURIUtils.java?rev=1674480&r1=1674479&r2=1674480&view=diff
==============================================================================
--- httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/client/utils/TestURIUtils.java (original)
+++ httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/client/utils/TestURIUtils.java Sat Apr 18 10:31:15 2015
@@ -137,6 +137,8 @@ public class TestURIUtils {
         Assert.assertEquals("http://www.example.com/a/", URIUtils.resolve(this.baseURI, "http://www.example.com/a%2f").toString());
         Assert.assertEquals("http://www.example.com/?q=%26", URIUtils.resolve(this.baseURI, "http://www.example.com/?q=%26").toString());
         Assert.assertEquals("http://www.example.com/%23?q=%26", URIUtils.resolve(this.baseURI, "http://www.example.com/%23?q=%26").toString());
+        Assert.assertEquals("http://www.example.com/blah-(%20-blah-%20&%20-blah-%20)-blah/",
+                URIUtils.resolve(this.baseURI, "http://www.example.com/blah-%28%20-blah-%20%26%20-blah-%20%29-blah/").toString());
     }
 
     @Test