Skip to content

Commit 8622910

Browse files
authored
Http klient med proxy (#1361)
1 parent 9b481f4 commit 8622910

File tree

6 files changed

+251
-176
lines changed

6 files changed

+251
-176
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
package no.nav.vedtak.klient.http;
2+
3+
import no.nav.vedtak.exception.IntegrasjonException;
4+
5+
import org.slf4j.Logger;
6+
import org.slf4j.LoggerFactory;
7+
8+
import java.io.IOException;
9+
import java.net.http.HttpClient;
10+
import java.net.http.HttpRequest;
11+
import java.net.http.HttpResponse;
12+
import java.util.Set;
13+
14+
public class BaseHttpClient {
15+
16+
private static final Logger LOG = LoggerFactory.getLogger(BaseHttpClient.class);
17+
private static final int RETRIES = 2; // 1 attempt, the n retries
18+
19+
private final HttpClient httpClient;
20+
21+
protected BaseHttpClient(HttpClient httpClient) {
22+
this.httpClient = httpClient;
23+
}
24+
25+
public String send(HttpClientRequest request) {
26+
var httpRequest = request.request();
27+
return ResponseHandler.handleResponse(doSendExpectStringRetry(httpRequest), httpRequest.uri(), Set.of());
28+
}
29+
30+
public String send(HttpClientRequest request, Set<Integer> acceptStatus) {
31+
var httpRequest = request.request();
32+
return ResponseHandler.handleResponse(doSendExpectStringRetry(httpRequest), httpRequest.uri(), acceptStatus);
33+
}
34+
35+
public byte[] sendReturnByteArray(HttpClientRequest request) {
36+
var httpRequest = request.request();
37+
return ResponseHandler.handleResponse(doSendExpectBytearrayRetry(httpRequest), httpRequest.uri(), Set.of());
38+
}
39+
40+
public HttpResponse<String> sendReturnResponse(HttpClientRequest request) {
41+
var httpRequest = request.request();
42+
return ResponseHandler.handleRawResponse(doSendExpectStringRetry(httpRequest), httpRequest.uri(), Set.of());
43+
}
44+
45+
public HttpResponse<String> sendReturnResponse(HttpClientRequest request, Set<Integer> acceptStatus) {
46+
var httpRequest = request.request();
47+
return ResponseHandler.handleRawResponse(doSendExpectStringRetry(httpRequest), httpRequest.uri(), acceptStatus);
48+
}
49+
50+
public HttpResponse<byte[]> sendReturnResponseByteArray(HttpClientRequest request) {
51+
var httpRequest = request.request();
52+
return ResponseHandler.handleRawResponse(doSendExpectBytearrayRetry(httpRequest), httpRequest.uri(), Set.of());
53+
}
54+
55+
/**
56+
* Raw response, not checked for status codes 4nn or 5nn - please ensure that any usage avoids "quiet errors"
57+
*/
58+
public HttpResponse<String> sendReturnUnhandled(HttpClientRequest request) {
59+
return doSendExpectStringRetry(request.request());
60+
}
61+
62+
public HttpResponse<String> sendReturnUnhandledNoRetry(HttpClientRequest request) {
63+
return doSendExpectString(request.request());
64+
}
65+
66+
private HttpResponse<byte[]> doSendExpectBytearrayRetry(HttpRequest httpRequest) {
67+
int i = RETRIES;
68+
while (i-- > 0) {
69+
try {
70+
return doSendExpectBytearray(httpRequest);
71+
} catch (IntegrasjonException e) {
72+
LOG.trace("F-157390 IntegrasjonException ved kall {} til endepunkt {}", RETRIES - i, e);
73+
}
74+
}
75+
return doSendExpectBytearray(httpRequest);
76+
}
77+
78+
private HttpResponse<String> doSendExpectStringRetry(HttpRequest httpRequest) {
79+
int i = RETRIES;
80+
while (i-- > 0) {
81+
try {
82+
return doSendExpectString(httpRequest);
83+
} catch (IntegrasjonException e) {
84+
LOG.trace("F-157390 IntegrasjonException ved kall {} til endepunkt {}", RETRIES - i, e);
85+
}
86+
}
87+
return doSendExpectString(httpRequest);
88+
}
89+
90+
private HttpResponse<byte[]> doSendExpectBytearray(HttpRequest request) {
91+
try {
92+
return httpClient.send(request, HttpResponse.BodyHandlers.ofByteArray());
93+
} catch (IOException e) {
94+
throw new IntegrasjonException("F-157391", "Uventet IO-exception mot endepunkt", e);
95+
} catch (InterruptedException e) {
96+
Thread.currentThread().interrupt();
97+
throw new IntegrasjonException("F-157392", "InterruptedException ved kall mot endepunkt", e);
98+
}
99+
}
100+
101+
private HttpResponse<String> doSendExpectString(HttpRequest request) {
102+
try {
103+
return httpClient.send(request, HttpResponse.BodyHandlers.ofString());
104+
} catch (IOException e) {
105+
throw new IntegrasjonException("F-157391", "Uventet IO-exception mot endepunkt", e);
106+
} catch (InterruptedException e) {
107+
Thread.currentThread().interrupt();
108+
throw new IntegrasjonException("F-157392", "InterruptedException ved kall mot endepunkt", e);
109+
}
110+
}
111+
}
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,7 @@
11
package no.nav.vedtak.klient.http;
22

3-
import java.io.IOException;
43
import java.net.http.HttpClient;
5-
import java.net.http.HttpRequest;
6-
import java.net.http.HttpResponse;
74
import java.time.Duration;
8-
import java.util.Set;
9-
10-
import org.slf4j.Logger;
11-
import org.slf4j.LoggerFactory;
12-
13-
import no.nav.vedtak.exception.IntegrasjonException;
145

156
/**
167
* Generic interface to using java.net.http.HttpClient using HttpKlientRequest to ensure callId and timeout
@@ -20,17 +11,12 @@
2011
* - Create a HttpRequest.Builder with URI, Method, and custom headers.
2112
* - Use DefaultHttpKlient.instance().sendAccept(HttpKlientRequest.callId(builder))
2213
*/
23-
public final class DefaultHttpClient {
24-
25-
private static final Logger LOG = LoggerFactory.getLogger(DefaultHttpClient.class);
26-
private static final int RETRIES = 2; // 1 attempt, the n retries
14+
public final class DefaultHttpClient extends BaseHttpClient {
2715

2816
private static DefaultHttpClient CLIENT;
2917

30-
private final HttpClient httpClient;
31-
3218
private DefaultHttpClient() {
33-
this.httpClient = HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(15)).proxy(HttpClient.Builder.NO_PROXY).build();
19+
super(HttpClient.newBuilder().connectTimeout(Duration.ofSeconds(15)).proxy(HttpClient.Builder.NO_PROXY).build());
3420
}
3521

3622
public static synchronized DefaultHttpClient client() {
@@ -41,94 +27,5 @@ public static synchronized DefaultHttpClient client() {
4127
}
4228
return inst;
4329
}
44-
45-
public String send(HttpClientRequest request) {
46-
var httpRequest = request.request();
47-
return ResponseHandler.handleResponse(doSendExpectStringRetry(httpRequest), httpRequest.uri(), Set.of());
48-
}
49-
50-
public String send(HttpClientRequest request, Set<Integer> acceptStatus) {
51-
var httpRequest = request.request();
52-
return ResponseHandler.handleResponse(doSendExpectStringRetry(httpRequest), httpRequest.uri(), acceptStatus);
53-
}
54-
55-
public byte[] sendReturnByteArray(HttpClientRequest request) {
56-
var httpRequest = request.request();
57-
return ResponseHandler.handleResponse(doSendExpectBytearrayRetry(httpRequest), httpRequest.uri(), Set.of());
58-
}
59-
60-
public HttpResponse<String> sendReturnResponse(HttpClientRequest request) {
61-
var httpRequest = request.request();
62-
return ResponseHandler.handleRawResponse(doSendExpectStringRetry(httpRequest), httpRequest.uri(), Set.of());
63-
}
64-
65-
public HttpResponse<String> sendReturnResponse(HttpClientRequest request, Set<Integer> acceptStatus) {
66-
var httpRequest = request.request();
67-
return ResponseHandler.handleRawResponse(doSendExpectStringRetry(httpRequest), httpRequest.uri(), acceptStatus);
68-
}
69-
70-
public HttpResponse<byte[]> sendReturnResponseByteArray(HttpClientRequest request) {
71-
var httpRequest = request.request();
72-
return ResponseHandler.handleRawResponse(doSendExpectBytearrayRetry(httpRequest), httpRequest.uri(), Set.of());
73-
}
74-
75-
/**
76-
* Raw response, not checked for status codes 4nn or 5nn - please ensure that any usage avoids "quiet errors"
77-
*/
78-
public HttpResponse<String> sendReturnUnhandled(HttpClientRequest request) {
79-
return doSendExpectStringRetry(request.request());
80-
}
81-
82-
public HttpResponse<String> sendReturnUnhandledNoRetry(HttpClientRequest request) {
83-
return doSendExpectString(request.request());
84-
}
85-
86-
private HttpResponse<byte[]> doSendExpectBytearrayRetry(HttpRequest httpRequest) {
87-
int i = RETRIES;
88-
while (i-- > 0) {
89-
try {
90-
return doSendExpectBytearray(httpRequest);
91-
} catch (IntegrasjonException e) {
92-
LOG.trace("F-157390 IntegrasjonException ved kall {} til endepunkt {}", RETRIES - i, e);
93-
}
94-
}
95-
return doSendExpectBytearray(httpRequest);
96-
}
97-
98-
private HttpResponse<String> doSendExpectStringRetry(HttpRequest httpRequest) {
99-
int i = RETRIES;
100-
while (i-- > 0) {
101-
try {
102-
return doSendExpectString(httpRequest);
103-
} catch (IntegrasjonException e) {
104-
LOG.trace("F-157390 IntegrasjonException ved kall {} til endepunkt {}", RETRIES - i, e);
105-
}
106-
}
107-
return doSendExpectString(httpRequest);
108-
}
109-
110-
private HttpResponse<byte[]> doSendExpectBytearray(HttpRequest request) {
111-
try {
112-
return httpClient.send(request, HttpResponse.BodyHandlers.ofByteArray());
113-
} catch (IOException e) {
114-
throw new IntegrasjonException("F-157391", "Uventet IO-exception mot endepunkt", e);
115-
} catch (InterruptedException e) {
116-
Thread.currentThread().interrupt();
117-
throw new IntegrasjonException("F-157392", "InterruptedException ved kall mot endepunkt", e);
118-
}
119-
}
120-
121-
private HttpResponse<String> doSendExpectString(HttpRequest request) {
122-
try {
123-
return httpClient.send(request, HttpResponse.BodyHandlers.ofString());
124-
} catch (IOException e) {
125-
throw new IntegrasjonException("F-157391", "Uventet IO-exception mot endepunkt", e);
126-
} catch (InterruptedException e) {
127-
Thread.currentThread().interrupt();
128-
throw new IntegrasjonException("F-157392", "InterruptedException ved kall mot endepunkt", e);
129-
}
130-
}
131-
132-
13330
}
13431

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package no.nav.vedtak.klient.http;
2+
3+
import no.nav.foreldrepenger.konfig.Environment;
4+
5+
import java.net.InetSocketAddress;
6+
import java.net.ProxySelector;
7+
import java.net.URI;
8+
import java.net.http.HttpClient;
9+
import java.time.Duration;
10+
import java.util.Optional;
11+
12+
public final class ProxyHttpClient extends BaseHttpClient {
13+
private static final Environment ENV = Environment.current();
14+
15+
private static final String AZURE_HTTP_PROXY = "azure.http.proxy";
16+
private static final String PROXY_KEY = "proxy.url";
17+
private static final String DEFAULT_PROXY_URL = "http://webproxy.nais:8088";
18+
19+
private static ProxyHttpClient CLIENT;
20+
21+
private ProxyHttpClient() {
22+
super(HttpClient.newBuilder()
23+
.connectTimeout(Duration.ofSeconds(15))
24+
.proxy(Optional.ofNullable(ENV.isFss() ? URI.create(ENV.getProperty(AZURE_HTTP_PROXY, getDefaultProxy())) : null)
25+
.map(p -> new InetSocketAddress(p.getHost(), p.getPort()))
26+
.map(ProxySelector::of)
27+
.orElse(HttpClient.Builder.NO_PROXY)).build());
28+
}
29+
30+
public static synchronized ProxyHttpClient client() {
31+
var inst = CLIENT;
32+
if (inst == null) {
33+
inst = new ProxyHttpClient();
34+
CLIENT = inst;
35+
}
36+
return inst;
37+
}
38+
39+
private static String getDefaultProxy() {
40+
return ENV.getProperty(PROXY_KEY, DEFAULT_PROXY_URL);
41+
}
42+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package no.nav.vedtak.felles.integrasjon.rest;
2+
3+
import no.nav.vedtak.klient.http.BaseHttpClient;
4+
import no.nav.vedtak.mapper.json.DefaultJsonMapper;
5+
6+
import java.net.HttpURLConnection;
7+
import java.net.http.HttpResponse;
8+
import java.util.List;
9+
import java.util.Map;
10+
import java.util.Optional;
11+
import java.util.Set;
12+
import java.util.function.Predicate;
13+
14+
class BaseRestClient {
15+
16+
private BaseHttpClient httpklient;
17+
18+
public BaseRestClient(BaseHttpClient httpClient) {
19+
this.httpklient = httpClient;
20+
}
21+
22+
public <T> T send(RestRequest request, Class<T> clazz) {
23+
var response = httpklient.send(request);
24+
return mapResponse(response, s -> false, clazz);
25+
}
26+
27+
public <T> T sendExpectConflict(RestRequest request, Class<T> clazz) {
28+
var response = httpklient.send(request, Set.of(HttpURLConnection.HTTP_CONFLICT));
29+
return mapResponse(response, s -> false, clazz);
30+
}
31+
32+
public <T> Optional<T> sendReturnOptional(RestRequest request, Class<T> clazz) {
33+
var response = httpklient.send(request);
34+
return Optional.ofNullable(mapResponse(response, String::isEmpty, clazz));
35+
}
36+
37+
public <T> List<T> sendReturnList(RestRequest request, Class<T> clazz) {
38+
var response = httpklient.send(request);
39+
return DefaultJsonMapper.listFromJson(response, clazz);
40+
}
41+
42+
public <T> Map<String, T> sendReturnMap(RestRequest request, Class<T> clazz) {
43+
var response = httpklient.send(request);
44+
return DefaultJsonMapper.mapFromJson(response, clazz);
45+
}
46+
47+
public byte[] sendReturnByteArray(RestRequest request) {
48+
return httpklient.sendReturnByteArray(request);
49+
}
50+
51+
public HttpResponse<String> sendReturnResponseString(RestRequest request) {
52+
return httpklient.sendReturnResponse(request);
53+
}
54+
55+
public HttpResponse<byte[]> sendReturnResponseByteArray(RestRequest request) {
56+
return httpklient.sendReturnResponseByteArray(request);
57+
}
58+
59+
/**
60+
* Raw response, not checked for status codes 4nn or 5nn - please ensure that any usage avoids "quiet errors"
61+
*/
62+
public HttpResponse<String> sendReturnUnhandled(RestRequest request) {
63+
return httpklient.sendReturnUnhandled(request);
64+
}
65+
66+
public HttpResponse<String> sendReturnUnhandledNoRetry(RestRequest request) {
67+
return httpklient.sendReturnUnhandledNoRetry(request);
68+
}
69+
70+
private <T> T mapResponse(String response, Predicate<String> filterOut, Class<T> clazz) {
71+
if (response == null || filterOut.test(response)) {
72+
return null;
73+
}
74+
if (clazz.isAssignableFrom(String.class)) {
75+
return clazz.cast(response);
76+
}
77+
return DefaultJsonMapper.fromJson(response, clazz);
78+
}
79+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package no.nav.vedtak.felles.integrasjon.rest;
2+
3+
import no.nav.vedtak.klient.http.ProxyHttpClient;
4+
5+
public final class ProxyRestClient extends BaseRestClient {
6+
7+
private ProxyRestClient() {
8+
super(ProxyHttpClient.client());
9+
}
10+
11+
public static ProxyRestClient client() {
12+
return new ProxyRestClient();
13+
}
14+
15+
}

0 commit comments

Comments
 (0)