1
1
package de .samply .utils ;
2
2
3
3
import de .samply .app .ProjectManagerConst ;
4
+ import de .samply .proxy .HttpProxyConfiguration ;
5
+ import de .samply .proxy .HttpsProxyConfiguration ;
6
+ import de .samply .proxy .ProxyConfiguration ;
4
7
import io .netty .channel .ChannelOption ;
5
8
import io .netty .channel .epoll .EpollChannelOption ;
6
9
import org .springframework .beans .factory .annotation .Value ;
7
10
import org .springframework .http .client .reactive .ReactorClientHttpConnector ;
8
11
import org .springframework .stereotype .Component ;
9
12
import org .springframework .web .reactive .function .client .WebClient ;
10
13
import reactor .netty .http .client .HttpClient ;
14
+ import reactor .netty .transport .ProxyProvider ;
11
15
12
16
import java .time .Duration ;
17
+ import java .util .Optional ;
13
18
14
19
@ Component
15
20
public class WebClientFactory {
@@ -22,6 +27,8 @@ public class WebClientFactory {
22
27
private final int webClientTcpKeepIntervalInSeconds ;
23
28
private final int webClientTcpKeepConnetionNumberOfTries ;
24
29
private final int webClientBufferSizeInBytes ;
30
+ private Optional <ProxyConfiguration > httpProxyConfiguration = Optional .empty ();
31
+ private Optional <ProxyConfiguration > httpsProxyConfiguration = Optional .empty ();
25
32
26
33
public WebClientFactory (
27
34
@ Value (ProjectManagerConst .WEBCLIENT_REQUEST_TIMEOUT_IN_SECONDS_SV ) Integer webClientRequestTimeoutInSeconds ,
@@ -31,7 +38,9 @@ public WebClientFactory(
31
38
@ Value (ProjectManagerConst .WEBCLIENT_TCP_KEEP_CONNECTION_NUMBER_OF_TRIES_SV ) Integer webClientTcpKeepConnetionNumberOfTries ,
32
39
@ Value (ProjectManagerConst .WEBCLIENT_MAX_NUMBER_OF_RETRIES_SV ) Integer webClientMaxNumberOfRetries ,
33
40
@ Value (ProjectManagerConst .WEBCLIENT_TIME_IN_SECONDS_AFTER_RETRY_WITH_FAILURE_SV ) Integer webClientTimeInSecondsAfterRetryWithFailure ,
34
- @ Value (ProjectManagerConst .WEBCLIENT_BUFFER_SIZE_IN_BYTES_SV ) Integer webClientBufferSizeInBytes
41
+ @ Value (ProjectManagerConst .WEBCLIENT_BUFFER_SIZE_IN_BYTES_SV ) Integer webClientBufferSizeInBytes ,
42
+ HttpProxyConfiguration httpProxyConfiguration ,
43
+ HttpsProxyConfiguration httpsProxyConfiguration
35
44
) {
36
45
this .webClientMaxNumberOfRetries = webClientMaxNumberOfRetries ;
37
46
this .webClientTimeInSecondsAfterRetryWithFailure = webClientTimeInSecondsAfterRetryWithFailure ;
@@ -41,10 +50,21 @@ public WebClientFactory(
41
50
this .webClientTcpKeepIntervalInSeconds = webClientTcpKeepIntervalInSeconds ;
42
51
this .webClientTcpKeepConnetionNumberOfTries = webClientTcpKeepConnetionNumberOfTries ;
43
52
this .webClientBufferSizeInBytes = webClientBufferSizeInBytes ;
53
+
54
+ setHttpProxies (httpProxyConfiguration , httpsProxyConfiguration );
55
+ }
56
+
57
+ private void setHttpProxies (HttpProxyConfiguration httpProxyConfiguration , HttpsProxyConfiguration httpsProxyConfiguration ) {
58
+ if (httpProxyConfiguration .isConfigured ()) {
59
+ this .httpProxyConfiguration = Optional .of (httpProxyConfiguration );
60
+ }
61
+ if (httpsProxyConfiguration .isConfigured ()) {
62
+ this .httpsProxyConfiguration = Optional .of (httpsProxyConfiguration );
63
+ }
44
64
}
45
65
46
66
public WebClient createWebClient (String baseUrl ) {
47
- return WebClient .builder ()
67
+ WebClient . Builder webClientBuilder = WebClient .builder ()
48
68
.codecs (codecs -> codecs .defaultCodecs ().maxInMemorySize (webClientBufferSizeInBytes ))
49
69
.clientConnector (new ReactorClientHttpConnector (
50
70
HttpClient .create ()
@@ -55,9 +75,22 @@ public WebClient createWebClient(String baseUrl) {
55
75
.option (EpollChannelOption .TCP_KEEPINTVL , webClientTcpKeepIntervalInSeconds )
56
76
.option (EpollChannelOption .TCP_KEEPCNT , webClientTcpKeepConnetionNumberOfTries )
57
77
))
58
- .baseUrl (baseUrl ).build ();
78
+ .baseUrl (baseUrl );
79
+ httpsProxyConfiguration .ifPresent (proxyConfig -> addProxy (webClientBuilder , proxyConfig ));
80
+ httpProxyConfiguration .ifPresent (proxyConfig -> addProxy (webClientBuilder , proxyConfig ));
81
+ return webClientBuilder .build ();
59
82
}
60
83
84
+ private void addProxy (WebClient .Builder webClientBuilder , ProxyConfiguration proxyConfiguration ) {
85
+ webClientBuilder .clientConnector (new ReactorClientHttpConnector (HttpClient .create ()
86
+ .proxy (proxy -> proxy .type (ProxyProvider .Proxy .HTTP )
87
+ .host (proxyConfiguration .getHost ())
88
+ .port (proxyConfiguration .getPort ())
89
+ .username (proxyConfiguration .getUsername ())
90
+ .password (password -> proxyConfiguration .getPassword ()) // Use Function.identity() here if needed
91
+ .nonProxyHosts (proxyConfiguration .getNoProxy ())
92
+ )));
93
+ }
61
94
62
95
public int getWebClientMaxNumberOfRetries () {
63
96
return webClientMaxNumberOfRetries ;
0 commit comments