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.client5.http.config;
29
30 import java.util.Arrays;
31 import java.util.concurrent.TimeUnit;
32
33 import org.apache.hc.core5.annotation.Contract;
34 import org.apache.hc.core5.annotation.ThreadingBehavior;
35 import org.apache.hc.core5.http.ssl.TLS;
36 import org.apache.hc.core5.http2.HttpVersionPolicy;
37 import org.apache.hc.core5.util.Timeout;
38
39
40
41
42
43
44 @Contract(threading = ThreadingBehavior.IMMUTABLE)
45 public class TlsConfig implements Cloneable {
46
47 public static final TlsConfig DEFAULT = new Builder().build();
48
49 private final Timeout handshakeTimeout;
50 private final String[] supportedProtocols;
51 private final String[] supportedCipherSuites;
52 private final HttpVersionPolicy httpVersionPolicy;
53
54
55
56
57 protected TlsConfig() {
58 this(null, null, null, null);
59 }
60
61 TlsConfig(
62 final Timeout handshakeTimeout,
63 final String[] supportedProtocols,
64 final String[] supportedCipherSuites,
65 final HttpVersionPolicy httpVersionPolicy) {
66 super();
67 this.handshakeTimeout = handshakeTimeout;
68 this.supportedProtocols = supportedProtocols;
69 this.supportedCipherSuites = supportedCipherSuites;
70 this.httpVersionPolicy = httpVersionPolicy;
71 }
72
73
74
75
76 public Timeout getHandshakeTimeout() {
77 return handshakeTimeout;
78 }
79
80
81
82
83 public String[] getSupportedProtocols() {
84 return supportedProtocols != null ? supportedProtocols.clone() : null;
85 }
86
87
88
89
90 public String[] getSupportedCipherSuites() {
91 return supportedCipherSuites != null ? supportedCipherSuites.clone() : null;
92 }
93
94
95
96
97 public HttpVersionPolicy getHttpVersionPolicy() {
98 return httpVersionPolicy;
99 }
100
101 @Override
102 protected TlsConfig clone() throws CloneNotSupportedException {
103 return (TlsConfig) super.clone();
104 }
105
106 @Override
107 public String toString() {
108 final StringBuilder builder = new StringBuilder();
109 builder.append("[");
110 builder.append("handshakeTimeout=").append(handshakeTimeout);
111 builder.append(", supportedProtocols=").append(Arrays.toString(supportedProtocols));
112 builder.append(", supportedCipherSuites=").append(Arrays.toString(supportedCipherSuites));
113 builder.append(", httpVersionPolicy=").append(httpVersionPolicy);
114 builder.append("]");
115 return builder.toString();
116 }
117
118 public static TlsConfig.Builder custom() {
119 return new Builder();
120 }
121
122 public static TlsConfig.Builder copy(final TlsConfig config) {
123 return new Builder()
124 .setHandshakeTimeout(config.getHandshakeTimeout())
125 .setSupportedProtocols(config.getSupportedProtocols())
126 .setSupportedCipherSuites(config.getSupportedCipherSuites())
127 .setVersionPolicy(config.getHttpVersionPolicy());
128 }
129
130 public static class Builder {
131
132 private Timeout handshakeTimeout;
133 private String[] supportedProtocols;
134 private String[] supportedCipherSuites;
135 private HttpVersionPolicy versionPolicy;
136
137
138
139
140
141
142
143
144
145
146
147
148 public Builder setHandshakeTimeout(final Timeout handshakeTimeout) {
149 this.handshakeTimeout = handshakeTimeout;
150 return this;
151 }
152
153
154
155
156
157 public Builder setHandshakeTimeout(final long handshakeTimeout, final TimeUnit timeUnit) {
158 this.handshakeTimeout = Timeout.of(handshakeTimeout, timeUnit);
159 return this;
160 }
161
162
163
164
165
166
167
168
169
170 public Builder setSupportedProtocols(final String... supportedProtocols) {
171 this.supportedProtocols = supportedProtocols;
172 return this;
173 }
174
175
176
177
178
179
180
181
182
183 public Builder setSupportedProtocols(final TLS... supportedProtocols) {
184 this.supportedProtocols = new String[supportedProtocols.length];
185 for (int i = 0; i < supportedProtocols.length; i++) {
186 final TLS protocol = supportedProtocols[i];
187 if (protocol != null) {
188 this.supportedProtocols[i] = protocol.id;
189 }
190 }
191 return this;
192 }
193
194
195
196
197
198
199
200
201
202 public Builder setSupportedCipherSuites(final String... supportedCipherSuites) {
203 this.supportedCipherSuites = supportedCipherSuites;
204 return this;
205 }
206
207
208
209
210
211
212
213
214
215
216 public Builder setVersionPolicy(final HttpVersionPolicy versionPolicy) {
217 this.versionPolicy = versionPolicy;
218 return this;
219 }
220
221 public TlsConfig build() {
222 return new TlsConfig(
223 handshakeTimeout,
224 supportedProtocols,
225 supportedCipherSuites,
226 versionPolicy != null ? versionPolicy : HttpVersionPolicy.NEGOTIATE);
227 }
228
229 }
230
231 }