Improved proxy request message generation
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/AsyncProtocolExec.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/AsyncProtocolExec.java
index 7317a0d..fe0d73b 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/AsyncProtocolExec.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/AsyncProtocolExec.java
@@ -27,8 +27,6 @@
 package org.apache.hc.client5.http.impl.async;
 
 import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
 import java.util.Iterator;
 import java.util.concurrent.atomic.AtomicBoolean;
 
@@ -62,8 +60,8 @@
 import org.apache.hc.core5.http.nio.AsyncEntityProducer;
 import org.apache.hc.core5.http.protocol.HttpCoreContext;
 import org.apache.hc.core5.http.protocol.HttpProcessor;
+import org.apache.hc.core5.http.support.BasicRequestBuilder;
 import org.apache.hc.core5.net.URIAuthority;
-import org.apache.hc.core5.net.URIBuilder;
 import org.apache.hc.core5.util.Args;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -119,17 +117,12 @@
 
         final HttpRequest request;
         if (proxy != null && !route.isTunnelled()) {
-            try {
-                URI uri = userRequest.getUri();
-                if (!uri.isAbsolute()) {
-                    uri = new URIBuilder(uri)
-                            .setHttpHost(target)
-                            .build();
-                }
-                request = HttpProxyRequest.rewrite(userRequest, uri);
-            } catch (final URISyntaxException ex) {
-                throw new ProtocolException("Invalid request URI: " + userRequest.getRequestUri(), ex);
+            final BasicRequestBuilder requestBuilder = BasicRequestBuilder.copy(userRequest);
+            if (requestBuilder.getAuthority() == null) {
+                requestBuilder.setAuthority(new URIAuthority(target));
             }
+            requestBuilder.setAbsoluteRequestUri(true);
+            request = requestBuilder.build();
         } else {
             request = userRequest;
         }
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/HttpProxyRequest.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/HttpProxyRequest.java
deleted file mode 100644
index e4ed272..0000000
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/HttpProxyRequest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package org.apache.hc.client5.http.impl.async;
-
-import java.net.URI;
-import java.util.Iterator;
-
-import org.apache.hc.client5.http.impl.ProtocolSupport;
-import org.apache.hc.core5.http.Header;
-import org.apache.hc.core5.http.HttpRequest;
-import org.apache.hc.core5.http.message.BasicHttpRequest;
-
-class HttpProxyRequest extends BasicHttpRequest {
-
-    static HttpProxyRequest rewrite(final HttpRequest original, final URI requestUri) {
-        final HttpProxyRequest copy = new HttpProxyRequest(original.getMethod(), requestUri);
-        copy.setVersion(original.getVersion());
-        for (final Iterator<Header> it = original.headerIterator(); it.hasNext(); ) {
-            copy.addHeader(it.next());
-        }
-        return copy;
-    }
-
-    private HttpProxyRequest(final String method, final URI requestUri) {
-        super(method, requestUri);
-    }
-
-    @Override
-    public String getRequestUri() {
-        return ProtocolSupport.getRequestUri(this);
-    }
-
-}
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/ClassicHttpProxyRequest.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/ClassicHttpProxyRequest.java
deleted file mode 100644
index bfeec4a..0000000
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/ClassicHttpProxyRequest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * ====================================================================
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation.  For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- */
-
-package org.apache.hc.client5.http.impl.classic;
-
-import java.net.URI;
-import java.util.Iterator;
-
-import org.apache.hc.client5.http.impl.ProtocolSupport;
-import org.apache.hc.core5.http.ClassicHttpRequest;
-import org.apache.hc.core5.http.Header;
-import org.apache.hc.core5.http.message.BasicClassicHttpRequest;
-
-class ClassicHttpProxyRequest extends BasicClassicHttpRequest {
-
-    static ClassicHttpProxyRequest rewrite(final ClassicHttpRequest original, final URI requestUri) {
-        final ClassicHttpProxyRequest copy = new ClassicHttpProxyRequest(original.getMethod(), requestUri);
-        copy.setVersion(original.getVersion());
-        for (final Iterator<Header> it = original.headerIterator(); it.hasNext(); ) {
-            copy.addHeader(it.next());
-        }
-        copy.setEntity(original.getEntity());
-        return copy;
-    }
-
-    private ClassicHttpProxyRequest(final String method, final URI requestUri) {
-        super(method, requestUri);
-    }
-
-    @Override
-    public String getRequestUri() {
-        return ProtocolSupport.getRequestUri(this);
-    }
-
-}
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/ProtocolExec.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/ProtocolExec.java
index af79242..9b311cd 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/ProtocolExec.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/ProtocolExec.java
@@ -28,8 +28,6 @@
 package org.apache.hc.client5.http.impl.classic;
 
 import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
 import java.util.Iterator;
 
 import org.apache.hc.client5.http.AuthenticationStrategy;
@@ -59,10 +57,10 @@
 import org.apache.hc.core5.http.Method;
 import org.apache.hc.core5.http.ProtocolException;
 import org.apache.hc.core5.http.io.entity.EntityUtils;
+import org.apache.hc.core5.http.io.support.ClassicRequestBuilder;
 import org.apache.hc.core5.http.protocol.HttpCoreContext;
 import org.apache.hc.core5.http.protocol.HttpProcessor;
 import org.apache.hc.core5.net.URIAuthority;
-import org.apache.hc.core5.net.URIBuilder;
 import org.apache.hc.core5.util.Args;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -124,17 +122,12 @@
         try {
             final ClassicHttpRequest request;
             if (proxy != null && !route.isTunnelled()) {
-                try {
-                    URI uri = userRequest.getUri();
-                    if (!uri.isAbsolute()) {
-                        uri = new URIBuilder(uri)
-                                .setHttpHost(target)
-                                .build();
-                    }
-                    request = ClassicHttpProxyRequest.rewrite(userRequest, uri);
-                } catch (final URISyntaxException ex) {
-                    throw new ProtocolException("Invalid request URI: " + userRequest.getRequestUri(), ex);
+                final ClassicRequestBuilder requestBuilder = ClassicRequestBuilder.copy(userRequest);
+                if (requestBuilder.getAuthority() == null) {
+                    requestBuilder.setAuthority(new URIAuthority(target));
                 }
+                requestBuilder.setAbsoluteRequestUri(true);
+                request = requestBuilder.build();
             } else {
                 request = userRequest;
             }