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 2024/01/16 09:29:11 UTC

(httpcomponents-client) branch 5.3.x updated: Example demonstrating how to make HttpClient negotiate or force a particular version of HTTP protocol during the TLS handshake

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

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


The following commit(s) were added to refs/heads/5.3.x by this push:
     new fbd695476 Example demonstrating how to make HttpClient negotiate or force a particular version of HTTP protocol during the TLS handshake
fbd695476 is described below

commit fbd69547601906a4ac5679e0913e04d011d6ab14
Author: Oleg Kalnichevski <ol...@apache.org>
AuthorDate: Tue Jan 16 10:27:01 2024 +0100

    Example demonstrating how to make HttpClient negotiate or force a particular version of HTTP protocol during the TLS handshake
---
 .../examples/AsyncClientHttpVersionPolicy.java     | 118 +++++++++++++++++++++
 1 file changed, 118 insertions(+)

diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/AsyncClientHttpVersionPolicy.java b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/AsyncClientHttpVersionPolicy.java
new file mode 100644
index 000000000..3792f2166
--- /dev/null
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/AsyncClientHttpVersionPolicy.java
@@ -0,0 +1,118 @@
+/*
+ * ====================================================================
+ * 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.examples;
+
+import java.util.concurrent.Future;
+
+import javax.net.ssl.SSLSession;
+
+import org.apache.hc.client5.http.async.methods.SimpleHttpRequest;
+import org.apache.hc.client5.http.async.methods.SimpleHttpResponse;
+import org.apache.hc.client5.http.async.methods.SimpleRequestBuilder;
+import org.apache.hc.client5.http.async.methods.SimpleRequestProducer;
+import org.apache.hc.client5.http.async.methods.SimpleResponseConsumer;
+import org.apache.hc.client5.http.config.TlsConfig;
+import org.apache.hc.client5.http.impl.async.CloseableHttpAsyncClient;
+import org.apache.hc.client5.http.impl.async.HttpAsyncClients;
+import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManager;
+import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManagerBuilder;
+import org.apache.hc.client5.http.protocol.HttpClientContext;
+import org.apache.hc.core5.concurrent.FutureCallback;
+import org.apache.hc.core5.http.HttpHost;
+import org.apache.hc.core5.http.message.StatusLine;
+import org.apache.hc.core5.http2.HttpVersionPolicy;
+import org.apache.hc.core5.io.CloseMode;
+
+/**
+ * This example demonstrates how to make HttpClient negotiate or force a particular
+ * version of HTTP protocol during the TLS handshake.
+ * <p/>
+ * Please note that protocol version policy setting also applies to non-HTTPS
+ * connections.
+ */
+public class AsyncClientHttpVersionPolicy {
+
+    public static void main(final String[] args) throws Exception {
+        final PoolingAsyncClientConnectionManager cm = PoolingAsyncClientConnectionManagerBuilder.create()
+                .setTlsConfigResolver(httphost -> TlsConfig.custom()
+//                        .setVersionPolicy(HttpVersionPolicy.FORCE_HTTP_1)
+//                        .setVersionPolicy(HttpVersionPolicy.FORCE_HTTP_2)
+                        .setVersionPolicy(HttpVersionPolicy.NEGOTIATE)
+                        .build())
+                .build();
+        try (final CloseableHttpAsyncClient client = HttpAsyncClients.custom()
+                .setConnectionManager(cm)
+                .build()) {
+
+            client.start();
+
+            final HttpHost target = new HttpHost("https", "httpbin.org");
+            final HttpClientContext clientContext = HttpClientContext.create();
+
+            final SimpleHttpRequest request = SimpleRequestBuilder.get()
+                    .setHttpHost(target)
+                    .setPath("/")
+                    .build();
+
+            System.out.println("Executing request " + request);
+            final Future<SimpleHttpResponse> future = client.execute(
+                    SimpleRequestProducer.create(request),
+                    SimpleResponseConsumer.create(),
+                    clientContext,
+                    new FutureCallback<SimpleHttpResponse>() {
+
+                        @Override
+                        public void completed(final SimpleHttpResponse response) {
+                            System.out.println(request + "->" + new StatusLine(response));
+                            System.out.println("HTTP protocol " + clientContext.getProtocolVersion());
+                            final SSLSession sslSession = clientContext.getSSLSession();
+                            if (sslSession != null) {
+                                System.out.println("SSL protocol " + sslSession.getProtocol());
+                                System.out.println("SSL cipher suite " + sslSession.getCipherSuite());
+                            }
+                            System.out.println(response.getBody());
+                        }
+
+                        @Override
+                        public void failed(final Exception ex) {
+                            System.out.println(request + "->" + ex);
+                        }
+
+                        @Override
+                        public void cancelled() {
+                            System.out.println(request + " cancelled");
+                        }
+
+                    });
+            future.get();
+
+            System.out.println("Shutting down");
+            client.close(CloseMode.GRACEFUL);
+        }
+    }
+
+}