Skip to content

Commit fbd6954

Browse files
committed
Example demonstrating how to make HttpClient negotiate or force a particular version of HTTP protocol during the TLS handshake
1 parent 6639de1 commit fbd6954

File tree

1 file changed

+118
-0
lines changed

1 file changed

+118
-0
lines changed
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
/*
2+
* ====================================================================
3+
* Licensed to the Apache Software Foundation (ASF) under one
4+
* or more contributor license agreements. See the NOTICE file
5+
* distributed with this work for additional information
6+
* regarding copyright ownership. The ASF licenses this file
7+
* to you under the Apache License, Version 2.0 (the
8+
* "License"); you may not use this file except in compliance
9+
* with the License. You may obtain a copy of the License at
10+
*
11+
* http://www.apache.org/licenses/LICENSE-2.0
12+
*
13+
* Unless required by applicable law or agreed to in writing,
14+
* software distributed under the License is distributed on an
15+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16+
* KIND, either express or implied. See the License for the
17+
* specific language governing permissions and limitations
18+
* under the License.
19+
* ====================================================================
20+
*
21+
* This software consists of voluntary contributions made by many
22+
* individuals on behalf of the Apache Software Foundation. For more
23+
* information on the Apache Software Foundation, please see
24+
* <http://www.apache.org/>.
25+
*
26+
*/
27+
package org.apache.hc.client5.http.examples;
28+
29+
import java.util.concurrent.Future;
30+
31+
import javax.net.ssl.SSLSession;
32+
33+
import org.apache.hc.client5.http.async.methods.SimpleHttpRequest;
34+
import org.apache.hc.client5.http.async.methods.SimpleHttpResponse;
35+
import org.apache.hc.client5.http.async.methods.SimpleRequestBuilder;
36+
import org.apache.hc.client5.http.async.methods.SimpleRequestProducer;
37+
import org.apache.hc.client5.http.async.methods.SimpleResponseConsumer;
38+
import org.apache.hc.client5.http.config.TlsConfig;
39+
import org.apache.hc.client5.http.impl.async.CloseableHttpAsyncClient;
40+
import org.apache.hc.client5.http.impl.async.HttpAsyncClients;
41+
import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManager;
42+
import org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManagerBuilder;
43+
import org.apache.hc.client5.http.protocol.HttpClientContext;
44+
import org.apache.hc.core5.concurrent.FutureCallback;
45+
import org.apache.hc.core5.http.HttpHost;
46+
import org.apache.hc.core5.http.message.StatusLine;
47+
import org.apache.hc.core5.http2.HttpVersionPolicy;
48+
import org.apache.hc.core5.io.CloseMode;
49+
50+
/**
51+
* This example demonstrates how to make HttpClient negotiate or force a particular
52+
* version of HTTP protocol during the TLS handshake.
53+
* <p/>
54+
* Please note that protocol version policy setting also applies to non-HTTPS
55+
* connections.
56+
*/
57+
public class AsyncClientHttpVersionPolicy {
58+
59+
public static void main(final String[] args) throws Exception {
60+
final PoolingAsyncClientConnectionManager cm = PoolingAsyncClientConnectionManagerBuilder.create()
61+
.setTlsConfigResolver(httphost -> TlsConfig.custom()
62+
// .setVersionPolicy(HttpVersionPolicy.FORCE_HTTP_1)
63+
// .setVersionPolicy(HttpVersionPolicy.FORCE_HTTP_2)
64+
.setVersionPolicy(HttpVersionPolicy.NEGOTIATE)
65+
.build())
66+
.build();
67+
try (final CloseableHttpAsyncClient client = HttpAsyncClients.custom()
68+
.setConnectionManager(cm)
69+
.build()) {
70+
71+
client.start();
72+
73+
final HttpHost target = new HttpHost("https", "httpbin.org");
74+
final HttpClientContext clientContext = HttpClientContext.create();
75+
76+
final SimpleHttpRequest request = SimpleRequestBuilder.get()
77+
.setHttpHost(target)
78+
.setPath("/")
79+
.build();
80+
81+
System.out.println("Executing request " + request);
82+
final Future<SimpleHttpResponse> future = client.execute(
83+
SimpleRequestProducer.create(request),
84+
SimpleResponseConsumer.create(),
85+
clientContext,
86+
new FutureCallback<SimpleHttpResponse>() {
87+
88+
@Override
89+
public void completed(final SimpleHttpResponse response) {
90+
System.out.println(request + "->" + new StatusLine(response));
91+
System.out.println("HTTP protocol " + clientContext.getProtocolVersion());
92+
final SSLSession sslSession = clientContext.getSSLSession();
93+
if (sslSession != null) {
94+
System.out.println("SSL protocol " + sslSession.getProtocol());
95+
System.out.println("SSL cipher suite " + sslSession.getCipherSuite());
96+
}
97+
System.out.println(response.getBody());
98+
}
99+
100+
@Override
101+
public void failed(final Exception ex) {
102+
System.out.println(request + "->" + ex);
103+
}
104+
105+
@Override
106+
public void cancelled() {
107+
System.out.println(request + " cancelled");
108+
}
109+
110+
});
111+
future.get();
112+
113+
System.out.println("Shutting down");
114+
client.close(CloseMode.GRACEFUL);
115+
}
116+
}
117+
118+
}

0 commit comments

Comments
 (0)