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 2021/02/10 21:21:35 UTC

[httpcomponents-core] 01/03: RFC 3986 conformance: BasicHttpRequest to support parsing of valid URI authority components not recognized by java.net.URI

This is an automated email from the ASF dual-hosted git repository.

olegk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/httpcomponents-core.git

commit 5af7cb596220b1f3aa9fb7998fbffeb56b80e6ac
Author: Oleg Kalnichevski <ol...@apache.org>
AuthorDate: Tue Feb 9 17:53:28 2021 +0100

    RFC 3986 conformance: BasicHttpRequest to support parsing of valid URI authority components not recognized by java.net.URI
---
 .../hc/core5/http/message/BasicHttpRequest.java    | 22 +++++++++++++++-------
 .../hc/core5/http/message/TestBasicMessages.java   | 13 +++++++++++--
 2 files changed, 26 insertions(+), 9 deletions(-)

diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/message/BasicHttpRequest.java b/httpcore5/src/main/java/org/apache/hc/core5/http/message/BasicHttpRequest.java
index 17742de..d83a83e 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/message/BasicHttpRequest.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/message/BasicHttpRequest.java
@@ -27,9 +27,6 @@
 
 package org.apache.hc.core5.http.message;
 
-import java.net.URI;
-import java.net.URISyntaxException;
-
 import org.apache.hc.core5.http.HttpHost;
 import org.apache.hc.core5.http.HttpRequest;
 import org.apache.hc.core5.http.Method;
@@ -39,6 +36,9 @@ import org.apache.hc.core5.net.URIAuthority;
 import org.apache.hc.core5.util.Args;
 import org.apache.hc.core5.util.TextUtils;
 
+import java.net.URI;
+import java.net.URISyntaxException;
+
 /**
  * Basic implementation of {@link HttpRequest}.
  *
@@ -223,10 +223,18 @@ public class BasicHttpRequest extends HeaderGroup implements HttpRequest {
     @Override
     public void setUri(final URI requestUri) {
         this.scheme = requestUri.getScheme();
-        this.authority = requestUri.getHost() != null ? new URIAuthority(
-                requestUri.getRawUserInfo(),
-                requestUri.getHost(),
-                requestUri.getPort()) : null;
+        if (requestUri.getHost() != null) {
+            this.authority = new URIAuthority(
+                    requestUri.getRawUserInfo(), requestUri.getHost(), requestUri.getPort());
+        } else if (requestUri.getRawAuthority() != null) {
+            try {
+                this.authority = URIAuthority.create(requestUri.getRawAuthority());
+            } catch (final URISyntaxException ignore) {
+                this.authority = null;
+            }
+        } else {
+            this.authority = null;
+        }
         final StringBuilder buf = new StringBuilder();
         final String rawPath = requestUri.getRawPath();
         if (!TextUtils.isBlank(rawPath)) {
diff --git a/httpcore5/src/test/java/org/apache/hc/core5/http/message/TestBasicMessages.java b/httpcore5/src/test/java/org/apache/hc/core5/http/message/TestBasicMessages.java
index 760bf8c..1b3937c 100644
--- a/httpcore5/src/test/java/org/apache/hc/core5/http/message/TestBasicMessages.java
+++ b/httpcore5/src/test/java/org/apache/hc/core5/http/message/TestBasicMessages.java
@@ -27,8 +27,6 @@
 
 package org.apache.hc.core5.http.message;
 
-import java.net.URI;
-
 import org.apache.hc.core5.http.HttpHost;
 import org.apache.hc.core5.http.HttpRequest;
 import org.apache.hc.core5.http.HttpResponse;
@@ -38,6 +36,8 @@ import org.apache.hc.core5.net.URIAuthority;
 import org.junit.Assert;
 import org.junit.Test;
 
+import java.net.URI;
+
 /**
  * Unit tests for {@link org.apache.hc.core5.http.HttpMessage}.
  *
@@ -205,5 +205,14 @@ public class TestBasicMessages {
         Assert.assertEquals(new URI("http://somehost/stuff"), request.getUri());
     }
 
+    @Test
+    public void testRequestHostWithReservedChars() throws Exception {
+        final HttpRequest request = new BasicHttpRequest(Method.GET, URI.create("http://someuser%21@%21example%21.com/stuff"));
+        Assert.assertEquals(Method.GET.name(), request.getMethod());
+        Assert.assertEquals("/stuff", request.getPath());
+        Assert.assertEquals(new URIAuthority("someuser%21", "%21example%21.com", -1), request.getAuthority());
+        Assert.assertEquals(new URI("http://%21example%21.com/stuff"), request.getUri());
+    }
+
 }