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:37 UTC

[httpcomponents-core] 03/03: BasicHttpRequest to support absolute request URI representation

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 e9e7b1aadfffae3d4ff95245dbc313ab53c377d0
Author: Oleg Kalnichevski <ol...@apache.org>
AuthorDate: Tue Feb 9 17:53:42 2021 +0100

    BasicHttpRequest to support absolute request URI representation
---
 .../http/io/support/ClassicRequestBuilder.java     |  7 +++
 .../hc/core5/http/message/BasicHttpRequest.java    | 62 +++++++++++++++-------
 .../http/nio/support/AsyncRequestBuilder.java      |  7 +++
 .../core5/http/support/AbstractRequestBuilder.java | 10 ++++
 .../hc/core5/http/support/BasicRequestBuilder.java |  7 +++
 .../hc/core5/http/message/TestBasicMessages.java   |  8 +++
 6 files changed, 82 insertions(+), 19 deletions(-)

diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/io/support/ClassicRequestBuilder.java b/httpcore5/src/main/java/org/apache/hc/core5/http/io/support/ClassicRequestBuilder.java
index 5c407f5..cd8835b 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/io/support/ClassicRequestBuilder.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/io/support/ClassicRequestBuilder.java
@@ -273,6 +273,12 @@ public class ClassicRequestBuilder extends AbstractRequestBuilder<ClassicHttpReq
         return this;
     }
 
+    @Override
+    public ClassicRequestBuilder setAbsoluteRequestUri(final boolean absoluteRequestUri) {
+        super.setAbsoluteRequestUri(absoluteRequestUri);
+        return this;
+    }
+
     public HttpEntity getEntity() {
         return entity;
     }
@@ -328,6 +334,7 @@ public class ClassicRequestBuilder extends AbstractRequestBuilder<ClassicHttpReq
         result.setVersion(getVersion());
         result.setHeaders(getHeaders());
         result.setEntity(entityCopy);
+        result.setAbsoluteRequestUri(isAbsoluteRequestUri());
         return result;
     }
 
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 ac93392..ed94598 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
@@ -54,6 +54,7 @@ public class BasicHttpRequest extends HeaderGroup implements HttpRequest {
     private URIAuthority authority;
     private ProtocolVersion version;
     private URI requestUri;
+    private boolean absoluteRequestUri;
 
     /**
      * Creates request message with the given method and request path.
@@ -218,9 +219,27 @@ public class BasicHttpRequest extends HeaderGroup implements HttpRequest {
         this.requestUri = null;
     }
 
+    /**
+     * Sets a flag that the {@link #getRequestUri()} method should return the request URI
+     * in an absolute form.
+     * <p>
+     * This flag can used when the request is going to be transmitted via an HTTP/1.1 proxy.
+     *
+     * @since 5.1
+     */
+    public void setAbsoluteRequestUri(final boolean absoluteRequestUri) {
+        this.absoluteRequestUri = absoluteRequestUri;
+    }
+
     @Override
     public String getRequestUri() {
-        return getPath();
+        if (absoluteRequestUri) {
+            final StringBuilder buf = new StringBuilder();
+            assembleRequestUri(buf);
+            return buf.toString();
+        } else {
+            return getPath();
+        }
     }
 
     @Override
@@ -253,25 +272,29 @@ public class BasicHttpRequest extends HeaderGroup implements HttpRequest {
         this.path = buf.toString();
     }
 
+    private void assembleRequestUri(final StringBuilder buf) {
+        if (this.authority != null) {
+            buf.append(this.scheme != null ? this.scheme : URIScheme.HTTP.id).append("://");
+            buf.append(this.authority.getHostName());
+            if (this.authority.getPort() >= 0) {
+                buf.append(":").append(this.authority.getPort());
+            }
+        }
+        if (this.path == null) {
+            buf.append("/");
+        } else {
+            if (buf.length() > 0 && !this.path.startsWith("/")) {
+                buf.append("/");
+            }
+            buf.append(this.path);
+        }
+    }
+
     @Override
     public URI getUri() throws URISyntaxException {
         if (this.requestUri == null) {
             final StringBuilder buf = new StringBuilder();
-            if (this.authority != null) {
-                buf.append(this.scheme != null ? this.scheme : URIScheme.HTTP.id).append("://");
-                buf.append(this.authority.getHostName());
-                if (this.authority.getPort() >= 0) {
-                    buf.append(":").append(this.authority.getPort());
-                }
-            }
-            if (this.path == null) {
-                buf.append("/");
-            } else {
-                if (buf.length() > 0 && !this.path.startsWith("/")) {
-                    buf.append("/");
-                }
-                buf.append(this.path);
-            }
+            assembleRequestUri(buf);
             this.requestUri = new URI(buf.toString());
         }
         return this.requestUri;
@@ -279,9 +302,10 @@ public class BasicHttpRequest extends HeaderGroup implements HttpRequest {
 
     @Override
     public String toString() {
-        final StringBuilder sb = new StringBuilder();
-        sb.append(this.method).append(" ").append(this.scheme).append("://").append(this.authority).append(this.path);
-        return sb.toString();
+        final StringBuilder buf = new StringBuilder();
+        buf.append(method).append(" ");
+        assembleRequestUri(buf);
+        return buf.toString();
     }
 
 }
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/AsyncRequestBuilder.java b/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/AsyncRequestBuilder.java
index a80737c..52212b6 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/AsyncRequestBuilder.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/nio/support/AsyncRequestBuilder.java
@@ -273,6 +273,12 @@ public class AsyncRequestBuilder extends AbstractRequestBuilder<AsyncRequestProd
         return this;
     }
 
+    @Override
+    public AsyncRequestBuilder setAbsoluteRequestUri(final boolean absoluteRequestUri) {
+        super.setAbsoluteRequestUri(absoluteRequestUri);
+        return this;
+    }
+
     public AsyncEntityProducer getEntity() {
         return entityProducer;
     }
@@ -333,6 +339,7 @@ public class AsyncRequestBuilder extends AbstractRequestBuilder<AsyncRequestProd
         final BasicHttpRequest request = new BasicHttpRequest(method, uriCopy);
         request.setVersion(getVersion());
         request.setHeaders(getHeaders());
+        request.setAbsoluteRequestUri(isAbsoluteRequestUri());
         return new BasicRequestProducer(request, entityProducerCopy);
     }
 
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/support/AbstractRequestBuilder.java b/httpcore5/src/main/java/org/apache/hc/core5/http/support/AbstractRequestBuilder.java
index 9c3c801..e01e439 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/support/AbstractRequestBuilder.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/support/AbstractRequestBuilder.java
@@ -51,6 +51,7 @@ public abstract class AbstractRequestBuilder<T> extends AbstractMessageBuilder<T
     private URI uri;
     private Charset charset;
     private List<NameValuePair> parameters;
+    private boolean absoluteRequestUri;
 
     protected AbstractRequestBuilder(final String method) {
         super();
@@ -180,4 +181,13 @@ public abstract class AbstractRequestBuilder<T> extends AbstractMessageBuilder<T
         return this;
     }
 
+    public boolean isAbsoluteRequestUri() {
+        return absoluteRequestUri;
+    }
+
+    public AbstractRequestBuilder<T> setAbsoluteRequestUri(final boolean absoluteRequestUri) {
+        this.absoluteRequestUri = absoluteRequestUri;
+        return this;
+    }
+
 }
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/support/BasicRequestBuilder.java b/httpcore5/src/main/java/org/apache/hc/core5/http/support/BasicRequestBuilder.java
index dab7bb7..74d3001 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/support/BasicRequestBuilder.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/support/BasicRequestBuilder.java
@@ -258,6 +258,12 @@ public class BasicRequestBuilder extends AbstractRequestBuilder<BasicHttpRequest
     }
 
     @Override
+    public BasicRequestBuilder setAbsoluteRequestUri(final boolean absoluteRequestUri) {
+        super.setAbsoluteRequestUri(absoluteRequestUri);
+        return this;
+    }
+
+    @Override
     public BasicHttpRequest build() {
         URI uri = getUri();
         final List<NameValuePair> parameters = getParameters();
@@ -274,6 +280,7 @@ public class BasicRequestBuilder extends AbstractRequestBuilder<BasicHttpRequest
         final BasicHttpRequest result = new BasicHttpRequest(getMethod(), uri != null ? uri : URI.create("/"));
         result.setVersion(getVersion());
         result.setHeaders(getHeaders());
+        result.setAbsoluteRequestUri(isAbsoluteRequestUri());
         return result;
     }
 
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 86d3c96..020d6a3 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
@@ -219,5 +219,13 @@ public class TestBasicMessages {
         new BasicHttpRequest(Method.GET, URI.create("http://host//stuff"));
     }
 
+    @Test
+    public void testRequestAbsoluteRequestUri() throws Exception {
+        final BasicHttpRequest request = new BasicHttpRequest(Method.GET, new HttpHost("http", "somehost", -1), "stuff");
+        Assert.assertEquals("stuff", request.getRequestUri());
+        request.setAbsoluteRequestUri(true);
+        Assert.assertEquals("http://somehost/stuff", request.getRequestUri());
+    }
+
 }