Skip to content
This repository was archived by the owner on Oct 6, 2025. It is now read-only.

Commit 19734d5

Browse files
committed
add proxy to fttp client
1 parent 89b11aa commit 19734d5

3 files changed

Lines changed: 72 additions & 18 deletions

File tree

codex-process-data-transfer/src/main/java/de/netzwerk_universitaetsmedizin/codex/processes/data_transfer/client/FttpClientFactory.java

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -80,27 +80,38 @@ public void testConnection()
8080
private final Path trustStorePath;
8181
private final Path certificatePath;
8282
private final Path privateKeyPath;
83-
private final String basicAuthUsername;
84-
private final String basicAuthPassword;
83+
8584
private final String fttpServerBase;
85+
private final String fttpBasicAuthUsername;
86+
private final String fttpBasicAuthPassword;
87+
8688
private final String fttpApiKey;
8789
private final String fttpStudy;
8890
private final String fttpTarget;
8991

90-
public FttpClientFactory(Path trustStorePath, Path certificatePath, Path privateKeyPath, String basicAuthUsername,
91-
String basicAuthPassword, String fttpServerBase, String fttpApiKey, String fttpStudy, String fttpTarget)
92+
private final String proxySchemeHostPort;
93+
private final String proxyUsername;
94+
private final String proxyPassword;
95+
96+
public FttpClientFactory(Path trustStorePath, Path certificatePath, Path privateKeyPath,
97+
String fttpBasicAuthUsername, String fttpBasicAuthPassword, String fttpServerBase, String fttpApiKey,
98+
String fttpStudy, String fttpTarget, String proxySchemeHostPort, String proxyUsername, String proxyPassword)
9299
{
93100
this.trustStorePath = trustStorePath;
94101
this.certificatePath = certificatePath;
95102
this.privateKeyPath = privateKeyPath;
96103

97-
this.basicAuthUsername = basicAuthUsername;
98-
this.basicAuthPassword = basicAuthPassword;
104+
this.fttpBasicAuthUsername = fttpBasicAuthUsername;
105+
this.fttpBasicAuthPassword = fttpBasicAuthPassword;
99106

100107
this.fttpServerBase = fttpServerBase;
101108
this.fttpApiKey = fttpApiKey;
102109
this.fttpStudy = fttpStudy;
103110
this.fttpTarget = fttpTarget;
111+
112+
this.proxySchemeHostPort = proxySchemeHostPort;
113+
this.proxyUsername = proxyUsername;
114+
this.proxyPassword = proxyPassword;
104115
}
105116

106117
@EventListener({ ContextRefreshedEvent.class })
@@ -144,8 +155,8 @@ protected FttpClient createFttpClient()
144155
logger.debug("Creating key-store from {} and {}", certificatePath.toString(), privateKeyPath.toString());
145156
KeyStore keyStore = readKeyStore(certificatePath, privateKeyPath, keyStorePassword);
146157

147-
return new FttpClientImpl(trustStore, keyStore, keyStorePassword, basicAuthUsername, basicAuthPassword,
148-
fttpServerBase, fttpApiKey, fttpStudy, fttpTarget);
158+
return new FttpClientImpl(trustStore, keyStore, keyStorePassword, fttpBasicAuthUsername, fttpBasicAuthPassword,
159+
fttpServerBase, fttpApiKey, fttpStudy, fttpTarget, proxySchemeHostPort, proxyUsername, proxyPassword);
149160
}
150161

151162
private KeyStore readTrustStore(Path trustPath)

codex-process-data-transfer/src/main/java/de/netzwerk_universitaetsmedizin/codex/processes/data_transfer/client/FttpClientImpl.java

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,15 @@
22

33
import static de.netzwerk_universitaetsmedizin.codex.processes.data_transfer.ConstantsDataTransfer.PSEUDONYM_PATTERN_STRING;
44

5+
import java.net.MalformedURLException;
6+
import java.net.URL;
57
import java.security.KeyStore;
68
import java.util.Objects;
79
import java.util.Optional;
810
import java.util.regex.Matcher;
911
import java.util.regex.Pattern;
1012

13+
import org.apache.commons.lang3.StringUtils;
1114
import org.hl7.fhir.r4.model.Base64BinaryType;
1215
import org.hl7.fhir.r4.model.CapabilityStatement;
1316
import org.hl7.fhir.r4.model.Identifier;
@@ -34,23 +37,32 @@ public class FttpClientImpl implements FttpClient, InitializingBean
3437

3538
private final IRestfulClientFactory clientFactory;
3639

37-
private final String basicAuthUsername;
38-
private final String basicAuthPassword;
39-
4040
private final String fttpServerBase;
41+
private final String fttpBasicAuthUsername;
42+
private final String fttpBasicAuthPassword;
43+
4144
private final String fttpStudy;
4245
private final String fttpTarget;
4346
private final String fttpApiKey;
4447

45-
public FttpClientImpl(KeyStore trustStore, KeyStore keyStore, char[] keyStorePassword, String basicAuthUsername,
46-
String basicAuthPassword, String fttpServerBase, String fttpApiKey, String fttpStudy, String fttpTarget)
48+
private final String proxySchemeHostPort;
49+
private final String proxyUsername;
50+
private final String proxyPassword;
51+
52+
public FttpClientImpl(KeyStore trustStore, KeyStore keyStore, char[] keyStorePassword, String fttpBasicAuthUsername,
53+
String fttpBasicAuthPassword, String fttpServerBase, String fttpApiKey, String fttpStudy, String fttpTarget,
54+
String proxySchemeHostPort, String proxyUsername, String proxyPassword)
4755
{
48-
this.basicAuthUsername = basicAuthUsername;
49-
this.basicAuthPassword = basicAuthPassword;
56+
this.proxySchemeHostPort = proxySchemeHostPort;
57+
this.proxyUsername = proxyUsername;
58+
this.proxyPassword = proxyPassword;
5059

5160
clientFactory = createClientFactory(trustStore, keyStore, keyStorePassword);
5261

5362
this.fttpServerBase = fttpServerBase;
63+
this.fttpBasicAuthUsername = fttpBasicAuthUsername;
64+
this.fttpBasicAuthPassword = fttpBasicAuthPassword;
65+
5466
this.fttpApiKey = fttpApiKey;
5567
this.fttpStudy = fttpStudy;
5668
this.fttpTarget = fttpTarget;
@@ -67,11 +79,32 @@ protected ApacheRestfulClientFactoryWithTlsConfig createClientFactory(KeyStore t
6779
ApacheRestfulClientFactoryWithTlsConfig hapiClientFactory = new ApacheRestfulClientFactoryWithTlsConfig(
6880
fhirContext, trustStore, keyStore, keyStorePassword);
6981
hapiClientFactory.setServerValidationMode(ServerValidationModeEnum.NEVER);
82+
configureProxy(hapiClientFactory);
7083

7184
fhirContext.setRestfulClientFactory(hapiClientFactory);
7285
return hapiClientFactory;
7386
}
7487

88+
private void configureProxy(ApacheRestfulClientFactoryWithTlsConfig clientFactory)
89+
{
90+
if (StringUtils.isNotBlank(proxySchemeHostPort))
91+
{
92+
try
93+
{
94+
URL url = new URL(proxySchemeHostPort);
95+
clientFactory.setProxy(url.getHost(), url.getPort());
96+
clientFactory.setProxyCredentials(proxyUsername, proxyPassword);
97+
98+
logger.info("Using proxy for fTTP connection with {host: {}, port: {}, username: {}}", url.getHost(),
99+
url.getPort(), proxyUsername);
100+
}
101+
catch (MalformedURLException e)
102+
{
103+
logger.error("Could not configure proxy", e);
104+
}
105+
}
106+
}
107+
75108
@Override
76109
public void afterPropertiesSet() throws Exception
77110
{
@@ -198,13 +231,13 @@ private IGenericClient createGenericClient()
198231
client.registerInterceptor(new LoggingInterceptor());
199232

200233
if (configuredWithBasicAuth())
201-
client.registerInterceptor(new BasicAuthInterceptor(basicAuthUsername, basicAuthPassword));
234+
client.registerInterceptor(new BasicAuthInterceptor(fttpBasicAuthUsername, fttpBasicAuthPassword));
202235

203236
return client;
204237
}
205238

206239
private boolean configuredWithBasicAuth()
207240
{
208-
return basicAuthUsername != null && basicAuthPassword != null;
241+
return fttpBasicAuthUsername != null && fttpBasicAuthPassword != null;
209242
}
210243
}

codex-process-data-transfer/src/main/java/de/netzwerk_universitaetsmedizin/codex/processes/data_transfer/spring/config/TransferDataConfig.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,15 @@ public class TransferDataConfig
121121
@Value("${de.netzwerk_universitaetsmedizin.codex.fttp.target:codex}")
122122
private String fttpTarget;
123123

124+
@Value("${org.highmed.dsf.bpe.fhir.remote.webservice.proxy.schemeHostPort:#{null}}")
125+
private String proxySchemeHostPort;
126+
127+
@Value("${org.highmed.dsf.bpe.fhir.remote.webservice.proxy.username:#{null}}")
128+
private String proxyUsername;
129+
130+
@Value("${org.highmed.dsf.bpe.fhir.remote.webservice.proxy.password:#{null}}")
131+
private String proxyPassword;
132+
124133
@Value("${org.highmed.dsf.fhir.local-organization.identifier}")
125134
private String localIdentifierValue;
126135

@@ -145,7 +154,8 @@ public FttpClientFactory fttpClientFactory()
145154
Path privateKeyPath = checkExists(fttpPrivateKey);
146155

147156
return new FttpClientFactory(trustStorePath, certificatePath, privateKeyPath, fttpBasicAuthUsername,
148-
fttpBasicAuthPassword, fttpServerBase, fttpApiKey, fttpStudy, fttpTarget);
157+
fttpBasicAuthPassword, fttpServerBase, fttpApiKey, fttpStudy, fttpTarget, proxySchemeHostPort,
158+
proxyUsername, proxyPassword);
149159
}
150160

151161
@Bean

0 commit comments

Comments
 (0)