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());
+ }
+
}