25
25
import java .io .IOException ;
26
26
import java .io .InputStream ;
27
27
import java .net .HttpURLConnection ;
28
+ import java .net .URI ;
28
29
import java .time .Duration ;
29
30
import java .util .List ;
30
31
import java .util .Map ;
54
55
public final class UrlConnectionHttpClient implements SdkHttpClient {
55
56
56
57
private final AttributeMap options ;
58
+ private final UrlConnectionFactory connectionFactory ;
57
59
58
- private UrlConnectionHttpClient (AttributeMap options ) {
60
+ private UrlConnectionHttpClient (AttributeMap options , UrlConnectionFactory connectionFactory ) {
59
61
this .options = options ;
62
+ if (connectionFactory != null ) {
63
+ this .connectionFactory = connectionFactory ;
64
+ } else {
65
+ this .connectionFactory = this ::createDefaultConnection ;
66
+ }
67
+
60
68
}
61
69
62
70
public static Builder builder () {
63
71
return new DefaultBuilder ();
64
72
}
65
73
74
+ /**
75
+ * Create a {@link HttpURLConnection} client with the default properties
76
+ *
77
+ * @return an {@link UrlConnectionHttpClient}
78
+ */
79
+ public static SdkHttpClient create () {
80
+ return new DefaultBuilder ().build ();
81
+ }
82
+
83
+ /**
84
+ * Use this method if you want to control the way a {@link HttpURLConnection} is created.
85
+ * This will ignore SDK defaults like {@link SdkHttpConfigurationOption#CONNECTION_TIMEOUT}
86
+ * and {@link SdkHttpConfigurationOption#READ_TIMEOUT}
87
+ * @param connectionFactory a function that, given a {@link URI} will create an {@link HttpURLConnection}
88
+ * @return an {@link UrlConnectionHttpClient}
89
+ */
90
+ public static SdkHttpClient create (UrlConnectionFactory connectionFactory ) {
91
+ return new UrlConnectionHttpClient (AttributeMap .empty (), connectionFactory );
92
+ }
93
+
66
94
@ Override
67
95
public ExecutableHttpRequest prepareRequest (HttpExecuteRequest request ) {
68
96
HttpURLConnection connection = createAndConfigureConnection (request );
@@ -75,8 +103,7 @@ public void close() {
75
103
}
76
104
77
105
private HttpURLConnection createAndConfigureConnection (HttpExecuteRequest request ) {
78
- HttpURLConnection connection =
79
- invokeSafely (() -> (HttpURLConnection ) request .httpRequest ().getUri ().toURL ().openConnection ());
106
+ HttpURLConnection connection = connectionFactory .createConnection (request .httpRequest ().getUri ());
80
107
request .httpRequest ()
81
108
.headers ()
82
109
.forEach ((key , values ) -> values .forEach (value -> connection .setRequestProperty (key , value )));
@@ -85,9 +112,13 @@ private HttpURLConnection createAndConfigureConnection(HttpExecuteRequest reques
85
112
connection .setDoOutput (true );
86
113
}
87
114
115
+ return connection ;
116
+ }
117
+
118
+ private HttpURLConnection createDefaultConnection (URI uri ) {
119
+ HttpURLConnection connection = invokeSafely (() -> (HttpURLConnection ) uri .toURL ().openConnection ());
88
120
connection .setConnectTimeout (saturatedCast (options .get (CONNECTION_TIMEOUT ).toMillis ()));
89
121
connection .setReadTimeout (saturatedCast (options .get (READ_TIMEOUT ).toMillis ()));
90
-
91
122
return connection ;
92
123
}
93
124
@@ -210,7 +241,8 @@ public void setConnectionTimeout(Duration connectionTimeout) {
210
241
public SdkHttpClient buildWithDefaults (AttributeMap serviceDefaults ) {
211
242
return new UrlConnectionHttpClient (standardOptions .build ()
212
243
.merge (serviceDefaults )
213
- .merge (SdkHttpConfigurationOption .GLOBAL_HTTP_DEFAULTS ));
244
+ .merge (SdkHttpConfigurationOption .GLOBAL_HTTP_DEFAULTS ),
245
+ null );
214
246
}
215
247
}
216
248
}
0 commit comments