View Javadoc
1   /*
2    * Copyright 2016 the original author or authors.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *       http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
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   * RestfulClientFactory that is aware of SSL context parameters
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              // @formatter:off
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             // Need to authenticate against proxy
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 }