1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 package org.apache.hc.core5.testing.nio;
29
30 import java.io.IOException;
31 import java.util.ArrayList;
32 import java.util.List;
33 import java.util.concurrent.Future;
34
35 import javax.net.ssl.SSLContext;
36
37 import org.apache.hc.core5.concurrent.BasicFuture;
38 import org.apache.hc.core5.concurrent.FutureCallback;
39 import org.apache.hc.core5.concurrent.FutureContribution;
40 import org.apache.hc.core5.function.Supplier;
41 import org.apache.hc.core5.http.HttpHost;
42 import org.apache.hc.core5.http.config.CharCodingConfig;
43 import org.apache.hc.core5.http.config.Http1Config;
44 import org.apache.hc.core5.http.impl.routing.RequestRouter;
45 import org.apache.hc.core5.http.nio.AsyncPushConsumer;
46 import org.apache.hc.core5.http.protocol.HttpProcessor;
47 import org.apache.hc.core5.http.protocol.UriPatternType;
48 import org.apache.hc.core5.http2.HttpVersionPolicy;
49 import org.apache.hc.core5.http2.config.H2Config;
50 import org.apache.hc.core5.http2.impl.H2Processors;
51 import org.apache.hc.core5.http2.nio.support.DefaultAsyncPushConsumerFactory;
52 import org.apache.hc.core5.reactor.IOEventHandlerFactory;
53 import org.apache.hc.core5.reactor.IOReactorConfig;
54 import org.apache.hc.core5.reactor.IOSession;
55 import org.apache.hc.core5.reactor.ssl.SSLSessionInitializer;
56 import org.apache.hc.core5.reactor.ssl.SSLSessionVerifier;
57 import org.apache.hc.core5.util.Args;
58 import org.apache.hc.core5.util.Timeout;
59
60 public class H2TestClient extends AsyncRequester {
61
62 private final SSLContext sslContext;
63 private final SSLSessionInitializer sslSessionInitializer;
64 private final SSLSessionVerifier sslSessionVerifier;
65 private final List<RequestRouter.Entry<Supplier<AsyncPushConsumer>>> routeEntries;
66
67 public H2TestClient(
68 final IOReactorConfig ioReactorConfig,
69 final SSLContext sslContext,
70 final SSLSessionInitializer sslSessionInitializer,
71 final SSLSessionVerifier sslSessionVerifier) throws IOException {
72 super(ioReactorConfig);
73 this.sslContext = sslContext;
74 this.sslSessionInitializer = sslSessionInitializer;
75 this.sslSessionVerifier = sslSessionVerifier;
76 this.routeEntries = new ArrayList<>();
77 }
78
79 public H2TestClient() throws IOException {
80 this(IOReactorConfig.DEFAULT, null, null, null);
81 }
82
83 public void register(final String uriPattern, final Supplier<AsyncPushConsumer> supplier) {
84 Args.notNull(uriPattern, "URI pattern");
85 Args.notNull(supplier, "Push consumer supplier");
86 routeEntries.add(new RequestRouter.Entry<>(uriPattern, supplier));
87 }
88
89 public void start(final IOEventHandlerFactory handlerFactory) throws IOException {
90 super.execute(handlerFactory);
91 }
92
93 public void start(final HttpProcessor httpProcessor, final H2Config h2Config) throws IOException {
94 start(new InternalClientProtocolNegotiationStarter(
95 httpProcessor,
96 new DefaultAsyncPushConsumerFactory(RequestRouter.create(
97 RequestRouter.LOCAL_AUTHORITY, UriPatternType.URI_PATTERN, routeEntries, RequestRouter.LOCAL_AUTHORITY_RESOLVER, null)),
98 HttpVersionPolicy.FORCE_HTTP_2,
99 h2Config,
100 Http1Config.DEFAULT,
101 CharCodingConfig.DEFAULT,
102 sslContext,
103 sslSessionInitializer,
104 sslSessionVerifier));
105 }
106
107 public void start(final HttpProcessor httpProcessor, final Http1Config http1Config) throws IOException {
108 start(new InternalClientProtocolNegotiationStarter(
109 httpProcessor,
110 new DefaultAsyncPushConsumerFactory(RequestRouter.create(
111 RequestRouter.LOCAL_AUTHORITY, UriPatternType.URI_PATTERN, routeEntries, RequestRouter.LOCAL_AUTHORITY_RESOLVER, null)),
112 HttpVersionPolicy.FORCE_HTTP_1,
113 H2Config.DEFAULT,
114 http1Config,
115 CharCodingConfig.DEFAULT,
116 sslContext,
117 sslSessionInitializer,
118 sslSessionVerifier));
119 }
120
121 public void start(final H2Config h2Config) throws IOException {
122 start(H2Processors.client(), h2Config);
123 }
124
125 public void start(final Http1Config http1Config) throws IOException {
126 start(H2Processors.client(), http1Config);
127 }
128
129 public void start() throws Exception {
130 start(H2Config.DEFAULT);
131 }
132
133 public Future<ClientSessionEndpoint> connect(
134 final HttpHost host,
135 final Timeout timeout,
136 final FutureCallback<ClientSessionEndpoint> callback) {
137 final BasicFuture<ClientSessionEndpoint> future = new BasicFuture<>(callback);
138 requestSession(host, timeout, new FutureContribution<IOSession>(future) {
139
140 @Override
141 public void completed(final IOSession session) {
142 future.completed(new ClientSessionEndpoint(session));
143 }
144
145 });
146 return future;
147 }
148
149 public Future<ClientSessionEndpoint> connect(final HttpHost host,final Timeout timeout) {
150 return connect(host, timeout, null);
151 }
152
153 public Future<ClientSessionEndpoint> connect(final String hostname, final int port, final Timeout timeout) {
154 return connect(new HttpHost(hostname, port), timeout, null);
155 }
156
157 }