1 package com.atlassian.httpclient.apache.httpcomponents.proxy;
2
3 import com.atlassian.fugue.Effect;
4 import com.atlassian.fugue.Option;
5 import com.atlassian.httpclient.api.factory.HttpClientOptions;
6 import com.google.common.base.Predicate;
7 import com.google.common.collect.Iterables;
8 import org.apache.http.auth.AuthScope;
9 import org.apache.http.auth.Credentials;
10 import org.apache.http.client.CredentialsProvider;
11 import org.apache.http.impl.client.SystemDefaultCredentialsProvider;
12
13 import static com.atlassian.httpclient.apache.httpcomponents.proxy.ProxyConfig.AuthenticationInfo;
14
15
16
17
18 public class ProxyCredentialsProvider implements CredentialsProvider {
19 private final SystemDefaultCredentialsProvider delegate;
20
21 private ProxyCredentialsProvider(final SystemDefaultCredentialsProvider delegate) {
22 this.delegate = delegate;
23 }
24
25 public static Option<ProxyCredentialsProvider> build(final HttpClientOptions options) {
26 final Iterable<AuthenticationInfo> authenticationInfos = Iterables.filter(
27 ProxyConfigFactory.getProxyAuthentication(options),
28 authenticationInfo -> authenticationInfo.getCredentials().isDefined());
29
30 return Iterables.isEmpty(authenticationInfos) ? Option.<ProxyCredentialsProvider>none() : Option.some(createCredentialProvider(authenticationInfos));
31 }
32
33 private static ProxyCredentialsProvider createCredentialProvider(final Iterable<AuthenticationInfo> authenticationInfos) {
34 final SystemDefaultCredentialsProvider credentialsProvider = new SystemDefaultCredentialsProvider();
35
36 for (final AuthenticationInfo authenticationInfo : authenticationInfos) {
37 authenticationInfo.getCredentials().foreach(credentials ->
38 credentialsProvider.setCredentials(authenticationInfo.getAuthScope(), credentials));
39 }
40
41 return new ProxyCredentialsProvider(credentialsProvider);
42 }
43
44 @Override
45 public void setCredentials(final AuthScope authscope, final Credentials credentials) {
46 delegate.setCredentials(authscope, credentials);
47 }
48
49 @Override
50 public Credentials getCredentials(final AuthScope authscope) {
51 return delegate.getCredentials(authscope);
52 }
53
54 @Override
55 public void clear() {
56 delegate.clear();
57 }
58 }