14
14
import java .util .concurrent .atomic .AtomicReference ;
15
15
import java .util .concurrent .atomic .LongAccumulator ;
16
16
import java .util .concurrent .atomic .LongAdder ;
17
+ import java .util .function .Function ;
17
18
18
19
final class DHttpClientContext implements HttpClient , SpiHttpClient {
19
20
@@ -39,21 +40,31 @@ final class DHttpClientContext implements HttpClient, SpiHttpClient {
39
40
private final LongAdder metricResBytes = new LongAdder ();
40
41
private final LongAdder metricResMicros = new LongAdder ();
41
42
private final LongAccumulator metricResMaxMicros = new LongAccumulator (Math ::max , 0 );
42
-
43
- DHttpClientContext (java .net .http .HttpClient httpClient , String baseUrl , Duration requestTimeout , BodyAdapter bodyAdapter , RetryHandler retryHandler , RequestListener requestListener , AuthTokenProvider authTokenProvider , RequestIntercept intercept ) {
43
+ private final Function <HttpException , RuntimeException > errorHandler ;
44
+
45
+ DHttpClientContext (
46
+ java .net .http .HttpClient httpClient ,
47
+ String baseUrl ,
48
+ Duration requestTimeout ,
49
+ BodyAdapter bodyAdapter ,
50
+ RetryHandler retryHandler ,
51
+ Function <HttpException , RuntimeException > errorHandler ,
52
+ RequestListener requestListener ,
53
+ AuthTokenProvider authTokenProvider ,
54
+ RequestIntercept intercept ) {
44
55
this .httpClient = httpClient ;
45
56
this .baseUrl = baseUrl ;
46
57
this .requestTimeout = requestTimeout ;
47
58
this .bodyAdapter = bodyAdapter ;
48
59
this .retryHandler = retryHandler ;
60
+ this .errorHandler = errorHandler ;
49
61
this .requestListener = requestListener ;
50
62
this .authTokenProvider = authTokenProvider ;
51
63
this .withAuthToken = authTokenProvider != null ;
52
64
this .requestIntercept = intercept ;
53
65
}
54
66
55
67
@ Override
56
- @ SuppressWarnings ("unchecked" )
57
68
public <T > T create (Class <T > clientInterface ) {
58
69
if (!clientInterface .isInterface ()) {
59
70
throw new IllegalArgumentException ("API declarations must be interfaces." );
@@ -109,6 +120,10 @@ public UrlBuilder url() {
109
120
return new UrlBuilder (baseUrl );
110
121
}
111
122
123
+ public Function <HttpException , RuntimeException > errorMapper () {
124
+ return errorHandler ;
125
+ }
126
+
112
127
@ Override
113
128
public java .net .http .HttpClient httpClient () {
114
129
return httpClient ;
@@ -184,19 +199,6 @@ public long avgMicros() {
184
199
}
185
200
}
186
201
187
- @ Override
188
- public void checkResponse (HttpResponse <?> response ) {
189
- if (response .statusCode () >= 300 ) {
190
- throw new HttpException (response , this );
191
- }
192
- }
193
-
194
- void checkMaybeThrow (HttpResponse <byte []> response ) {
195
- if (response .statusCode () >= 300 ) {
196
- throw new HttpException (this , response );
197
- }
198
- }
199
-
200
202
@ SuppressWarnings ("unchecked" )
201
203
public BodyContent readErrorContent (boolean responseAsBytes , HttpResponse <?> httpResponse ) {
202
204
if (responseAsBytes ) {
@@ -259,16 +261,28 @@ String firstHeader(HttpHeaders headers, String... names) {
259
261
<T > HttpResponse <T > send (HttpRequest .Builder requestBuilder , HttpResponse .BodyHandler <T > bodyHandler ) {
260
262
try {
261
263
return httpClient .send (requestBuilder .build (), bodyHandler );
262
- } catch (final IOException e ) {
263
- throw new HttpException (499 , e );
264
264
} catch (final InterruptedException e ) {
265
265
Thread .currentThread ().interrupt ();
266
266
throw new HttpException (499 , e );
267
+ } catch (final Exception e ) {
268
+ throw new HttpException (499 , e );
267
269
}
268
270
}
269
271
270
- <T > CompletableFuture <HttpResponse <T >> sendAsync (HttpRequest .Builder requestBuilder , HttpResponse .BodyHandler <T > bodyHandler ) {
271
- return httpClient .sendAsync (requestBuilder .build (), bodyHandler );
272
+ <T > CompletableFuture <HttpResponse <T >> sendAsync (
273
+ HttpRequest .Builder requestBuilder , HttpResponse .BodyHandler <T > bodyHandler ) {
274
+ return httpClient
275
+ .sendAsync (requestBuilder .build (), bodyHandler )
276
+ .handle (
277
+ (r , e ) -> {
278
+ if (e != null ) {
279
+ if (e .getCause () instanceof InterruptedException ) {
280
+ Thread .currentThread ().interrupt ();
281
+ }
282
+ throw new HttpException (499 , e .getCause ());
283
+ }
284
+ return r ;
285
+ });
272
286
}
273
287
274
288
<T > BodyContent write (T bean , Class <?> type , String contentType ) {
0 commit comments