1 package com.atlassian.httpclient.api.factory;
2
3 import com.google.common.base.Preconditions;
4 import com.google.common.collect.ImmutableMap;
5
6 import javax.annotation.Nonnull;
7 import java.util.Collections;
8 import java.util.HashMap;
9 import java.util.List;
10 import java.util.Map;
11
12
13
14
15 public class ProxyOptions {
16
17
18
19
20 public enum ProxyMode {
21 SYSTEM_PROPERTIES, CONFIGURED, NO_PROXY
22 }
23
24
25
26
27
28
29 public Map<Scheme, Host> getProxyHosts() {
30 return Collections.unmodifiableMap(proxyHostMap);
31 }
32
33
34
35
36 public Map<Scheme, List<String>> getNonProxyHosts() {
37 return Collections.unmodifiableMap(nonProxyHosts);
38 }
39
40
41
42
43 public ProxyMode getProxyMode() {
44 return proxyMode;
45 }
46
47 private final Map<Scheme, Host> proxyHostMap;
48
49 private final Map<Scheme, List<String>> nonProxyHosts;
50
51 private final ProxyMode proxyMode;
52
53 private ProxyOptions(ProxyMode mode, Map<Scheme, Host> proxyHostMap, Map<Scheme, List<String>> nonProxyHosts) {
54 this.proxyMode = mode;
55 this.proxyHostMap = proxyHostMap;
56 this.nonProxyHosts = nonProxyHosts;
57 }
58
59
60
61
62 public static class ProxyOptionsBuilder {
63 private Map<Scheme, Host> proxyHostMap = new HashMap<Scheme, Host>();
64
65 private Map<Scheme, List<String>> nonProxyHosts = new HashMap<Scheme, List<String>>();
66
67 private ProxyMode proxyMode = ProxyMode.SYSTEM_PROPERTIES;
68
69
70
71
72
73
74 public static ProxyOptionsBuilder create() {
75 return new ProxyOptionsBuilder();
76 }
77
78
79
80
81 public ProxyOptions build() {
82 return new ProxyOptions(proxyMode, proxyHostMap, nonProxyHosts);
83 }
84
85
86
87
88
89
90 public ProxyOptionsBuilder withNoProxy() {
91 proxyHostMap = ImmutableMap.of();
92 nonProxyHosts = ImmutableMap.of();
93 proxyMode = ProxyMode.NO_PROXY;
94 return this;
95 }
96
97
98
99
100
101
102 public ProxyOptionsBuilder withDefaultSystemProperties() {
103 proxyHostMap = ImmutableMap.of();
104 nonProxyHosts = ImmutableMap.of();
105 proxyMode = ProxyMode.SYSTEM_PROPERTIES;
106 return this;
107 }
108
109
110
111
112
113
114
115
116
117 public ProxyOptionsBuilder withProxy(final @Nonnull Scheme scheme, final @Nonnull Host proxyHost) {
118 Preconditions.checkNotNull(proxyHost, "Proxy host cannot be null");
119 Preconditions.checkNotNull(scheme, "Scheme must not be null");
120
121 this.proxyHostMap.put(scheme, proxyHost);
122 proxyMode = ProxyMode.CONFIGURED;
123 return this;
124 }
125
126
127
128
129
130
131
132
133
134 public ProxyOptionsBuilder withNonProxyHost(final @Nonnull Scheme scheme, final @Nonnull List<String> nonProxyHosts) {
135 Preconditions.checkNotNull(nonProxyHosts, "Non proxy hosts cannot be null");
136 Preconditions.checkNotNull(scheme, "Scheme must not be null");
137
138
139 this.nonProxyHosts.put(scheme, nonProxyHosts);
140 return this;
141 }
142
143
144
145
146
147
148
149
150
151 public ProxyOptionsBuilder withProxy(Map<Scheme, Host> proxyHostMap, Map<Scheme, List<String>> nonProxyHosts) {
152 this.proxyHostMap = proxyHostMap;
153 this.nonProxyHosts = nonProxyHosts;
154 proxyMode = ProxyMode.CONFIGURED;
155 return this;
156 }
157 }
158
159 }