1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.openehealth.ipf.commons.ihe.fhir;
18
19 import ca.uhn.fhir.context.FhirContext;
20 import ca.uhn.fhir.rest.api.RequestTypeEnum;
21 import ca.uhn.fhir.rest.client.apache.ApacheHttpClient;
22 import ca.uhn.fhir.rest.client.api.Header;
23 import ca.uhn.fhir.rest.client.api.IHttpClient;
24 import ca.uhn.fhir.rest.client.impl.RestfulClientFactory;
25 import org.apache.commons.lang3.StringUtils;
26 import org.apache.http.HttpHost;
27 import org.apache.http.auth.AuthScope;
28 import org.apache.http.auth.UsernamePasswordCredentials;
29 import org.apache.http.client.CredentialsProvider;
30 import org.apache.http.client.HttpClient;
31 import org.apache.http.client.config.RequestConfig;
32 import org.apache.http.impl.client.BasicCredentialsProvider;
33 import org.apache.http.impl.client.HttpClientBuilder;
34 import org.apache.http.impl.client.HttpClients;
35 import org.apache.http.impl.client.ProxyAuthenticationStrategy;
36 import org.openehealth.ipf.commons.ihe.fhir.translation.FhirSecurityInformation;
37
38 import java.util.List;
39 import java.util.Map;
40 import java.util.concurrent.TimeUnit;
41
42
43
44
45 public class SslAwareApacheRestfulClientFactory extends RestfulClientFactory {
46
47 private HttpClient httpClient;
48 private HttpHost proxy;
49 private FhirSecurityInformation securityInformation;
50
51 public SslAwareApacheRestfulClientFactory(FhirContext theFhirContext) {
52 super(theFhirContext);
53 }
54
55 @Override
56 protected IHttpClient getHttpClient(String theServerBase) {
57 return new ApacheHttpClient(getNativeHttpClient(), new StringBuilder(theServerBase), null, null, null, null);
58 }
59
60 @Override
61 protected void resetHttpClient() {
62 httpClient = null;
63 }
64
65 @Override
66 public IHttpClient getHttpClient(StringBuilder url, Map<String, List<String>> ifNoneExistParams, String ifNoneExistString, RequestTypeEnum theRequestType, List<Header> theHeaders) {
67 return new ApacheHttpClient(getNativeHttpClient(), url, ifNoneExistParams, ifNoneExistString, theRequestType,
68 theHeaders);
69 }
70
71 @Override
72 public void setHttpClient(Object httpClient) {
73 this.httpClient = (HttpClient) httpClient;
74 }
75
76 @Override
77 public void setProxy(String host, Integer port) {
78 proxy = host != null ? new HttpHost(host, port, "http") : null;
79 }
80
81 public void setSecurityInformation(FhirSecurityInformation securityInformation) {
82 this.securityInformation = securityInformation;
83 }
84
85 protected synchronized HttpClient getNativeHttpClient() {
86 if (httpClient == null) {
87
88
89 RequestConfig defaultRequestConfig = RequestConfig.custom()
90 .setConnectTimeout(getConnectTimeout())
91 .setSocketTimeout(getSocketTimeout())
92 .setConnectionRequestTimeout(getConnectionRequestTimeout())
93 .setProxy(proxy)
94 .setStaleConnectionCheckEnabled(true)
95 .build();
96
97 HttpClientBuilder builder = HttpClients.custom()
98 .useSystemProperties()
99 .setDefaultRequestConfig(defaultRequestConfig)
100 .setMaxConnTotal(getPoolMaxTotal())
101 .setMaxConnPerRoute(getPoolMaxPerRoute())
102 .setConnectionTimeToLive(5, TimeUnit.SECONDS)
103 .disableCookieManagement();
104
105 if (securityInformation != null) {
106 securityInformation.configureHttpClientBuilder(builder);
107 }
108
109
110 if (proxy != null && StringUtils.isNotBlank(getProxyUsername()) && StringUtils.isNotBlank(getProxyPassword())) {
111 CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
112 credentialsProvider.setCredentials(new AuthScope(proxy.getHostName(), proxy.getPort()),
113 new UsernamePasswordCredentials(getProxyUsername(), getProxyPassword()));
114 builder.setProxyAuthenticationStrategy(new ProxyAuthenticationStrategy());
115 builder.setDefaultCredentialsProvider(credentialsProvider);
116 }
117
118 httpClient = builder.build();
119 }
120
121 return httpClient;
122 }
123 }