[
https://issues.apache.org/jira/browse/HTTPCLIENT-2310?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17790562#comment-17790562
]
Marian commented on HTTPCLIENT-2310:
------------------------------------
[~olegk], there is a code example:
{code:java}
package org.example;
import org.apache.hc.client5.http.async.methods.SimpleHttpRequest;
import org.apache.hc.client5.http.async.methods.SimpleRequestBuilder;
import org.apache.hc.client5.http.async.methods.SimpleRequestProducer;
import org.apache.hc.client5.http.config.ConnectionConfig;
import org.apache.hc.client5.http.config.RequestConfig;
import org.apache.hc.client5.http.config.TlsConfig;
import org.apache.hc.client5.http.cookie.StandardCookieSpec;
import org.apache.hc.client5.http.impl.async.CloseableHttpAsyncClient;
import org.apache.hc.client5.http.impl.async.HttpAsyncClientBuilder;
import org.apache.hc.client5.http.impl.async.HttpAsyncClients;
import
org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManagerBuilder;
import org.apache.hc.client5.http.ssl.ClientTlsStrategyBuilder;
import org.apache.hc.core5.concurrent.FutureCallback;
import org.apache.hc.core5.http.HttpHost;
import org.apache.hc.core5.http.HttpResponse;
import org.apache.hc.core5.http.Message;
import org.apache.hc.core5.http.nio.AsyncResponseConsumer;
import org.apache.hc.core5.http.nio.entity.BasicAsyncEntityConsumer;
import org.apache.hc.core5.http.nio.support.BasicResponseConsumer;
import org.apache.hc.core5.http.ssl.TLS;
import org.apache.hc.core5.http2.HttpVersionPolicy;
import org.apache.hc.core5.io.CloseMode;
import org.apache.hc.core5.pool.PoolConcurrencyPolicy;
import org.apache.hc.core5.pool.PoolReusePolicy;
import org.apache.hc.core5.reactor.IOReactorConfig;
import org.apache.hc.core5.util.Timeout;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Future;
public class App
{
public static void main(final String[] args) throws Exception {
final HttpAsyncClientBuilder clientBuilder = HttpAsyncClients.custom()
.addRequestInterceptorFirst((request, entity, context) -> {
String method = request.getMethod();
System.out.println("method: " + method);
if (method.equals("CONNECT")) {
request.addHeader("Custom-Header", "value");
}
})
.setConnectionManager(PoolingAsyncClientConnectionManagerBuilder.create()
.setTlsStrategy(ClientTlsStrategyBuilder.create()
.setTlsVersions(TLS.V_1_3)
.build())
.setPoolConcurrencyPolicy(PoolConcurrencyPolicy.LAX)
.setConnPoolPolicy(PoolReusePolicy.LIFO)
.setDefaultConnectionConfig(ConnectionConfig.custom()
.setSocketTimeout(Timeout.ofMinutes(1))
.setConnectTimeout(Timeout.ofMinutes(1))
.setTimeToLive(Timeout.ofMinutes(1))
.build())
.setDefaultTlsConfig(TlsConfig.custom()
.setVersionPolicy(HttpVersionPolicy.FORCE_HTTP_2)
.setHandshakeTimeout(Timeout.ofMinutes(1))
.build())
.build())
.setIOReactorConfig(IOReactorConfig.custom()
.setSoTimeout(Timeout.ofMinutes(1))
.setIoThreadCount(1)
.build())
.setDefaultRequestConfig(RequestConfig.custom()
.setCookieSpec(StandardCookieSpec.STRICT)
.build())
.disableCookieManagement()
.setProxy(new HttpHost("38.15.154.224", 3128)); //Set your own
proxy
final CloseableHttpAsyncClient client = clientBuilder.build();
client.start();
CountDownLatch latch = new CountDownLatch(1);
final String requestUri = "https://www.google.com/";
final SimpleHttpRequest request =
SimpleRequestBuilder.get(requestUri).build();
final SimpleRequestProducer producer =
SimpleRequestProducer.create(request);
final AsyncResponseConsumer<Message<HttpResponse, byte[]>> consumer =
new BasicResponseConsumer<>(new BasicAsyncEntityConsumer());
System.out.println("Executing request " + request);
FutureCallback<Message<HttpResponse, byte[]>> callback = new
FutureCallback<Message<HttpResponse, byte[]>>() {
@Override
public void completed(Message<HttpResponse, byte[]> response) {
latch.countDown();
System.out.println(response.getHead().getVersion() + " " +
response.getHead().getCode());
}
@Override
public void failed(Exception ex) {
latch.countDown();
System.out.println("Error executing HTTP request: " +
ex.getMessage());
}
@Override
public void cancelled() {
latch.countDown();
System.out.println("HTTP request execution cancelled");
}
};
Future<Message<org.apache.hc.core5.http.HttpResponse, byte[]>> future =
client.execute(producer, consumer, callback);
latch.await();
future.get();
System.out.println("Shutting down");
client.close(CloseMode.GRACEFUL);
}
}
{code}
The main part of the code is proxy. Due to a proxy, we can catch connect:
{code:java}
Executing request GET https://www.google.com/
method: CONNECT
method: GET
HTTP/2.0 200
Shutting downProcess finished with exit code 0 {code}
This helps us to throw our request to the server with custom headers:
!image-2023-11-28-15-12-20-327.png|width=681,height=133!
This won't work without the proxy, but if the client can catch it in the
described case, could it catch the "connect" request every time?
> HttpRequestInterceptor doesn't catch a CONNECT request
> ------------------------------------------------------
>
> Key: HTTPCLIENT-2310
> URL: https://issues.apache.org/jira/browse/HTTPCLIENT-2310
> Project: HttpComponents HttpClient
> Issue Type: Wish
> Components: HttpClient (classic)
> Affects Versions: 5.2.2, 5.2.1
> Reporter: Marian
> Priority: Minor
> Attachments: image-2023-11-28-15-12-04-268.png,
> image-2023-11-28-15-12-20-327.png
>
>
> HttpRequestInterceptor can be added to both CloseableHttpClient and
> CloseableHttpAsyncClient, but a CONNECT request can be caught only with
> CloseableHttpAsyncClient.
> Even if I use the following examples: [for
> async|https://github.com/apache/httpcomponents-client/blob/5.2.x/httpclient5/src/test/java/org/apache/hc/client5/http/examples/AsyncClientInterceptors.java]
> or [for
> classic|https://github.com/apache/httpcomponents-client/blob/5.2.x/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientInterceptors.java]
> from GitHub.
> Could it be possible to fix this issue and cover the "connect" request in
> CloseableHttpClient's request interceptor?
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]