/
SelenideProxyServer.java
152 lines (133 loc) · 4.58 KB
/
SelenideProxyServer.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
package com.codeborne.selenide.proxy;
import com.codeborne.selenide.Configuration;
import net.lightbody.bmp.BrowserMobProxy;
import net.lightbody.bmp.client.ClientUtil;
import net.lightbody.bmp.filters.RequestFilter;
import net.lightbody.bmp.filters.ResponseFilter;
import org.openqa.selenium.Proxy;
import java.net.InetSocketAddress;
import java.util.HashMap;
import java.util.Map;
import static java.lang.Integer.parseInt;
import static org.apache.commons.lang3.StringUtils.isEmpty;
/**
* Selenide own proxy server to intercept server responses
*
* It holds map of request and response filters by name.
*/
public class SelenideProxyServer {
private final InetAddressResolver inetAddressResolver;
private final Proxy outsideProxy;
private final BrowserMobProxy proxy;
private final Map<String, RequestFilter> requestFilters = new HashMap<>();
private final Map<String, ResponseFilter> responseFilters = new HashMap<>();
private int port;
/**
* Create server
* Note that server is not started nor activated yet.
*
* @param outsideProxy another proxy server used by test author for his own need (can be null)
*/
public SelenideProxyServer(Proxy outsideProxy) {
this(outsideProxy, new InetAddressResolver(), new BrowserMobProxyServerUnlimited());
}
protected SelenideProxyServer(Proxy outsideProxy, InetAddressResolver inetAddressResolver, BrowserMobProxy proxy) {
this.outsideProxy = outsideProxy;
this.inetAddressResolver = inetAddressResolver;
this.proxy = proxy;
}
/**
* Start the server
*
* It automatically adds one response filter "download" that can intercept downloaded files.
*/
public void start() {
proxy.setTrustAllServers(true);
if (outsideProxy != null) {
proxy.setChainedProxy(getProxyAddress(outsideProxy));
}
addRequestFilter("authentication", new AuthenticationFilter());
addRequestFilter("requestSizeWatchdog", new RequestSizeWatchdog());
addResponseFilter("responseSizeWatchdog", new ResponseSizeWatchdog());
addResponseFilter("download", new FileDownloadFilter());
proxy.start(Configuration.proxyPort);
port = proxy.getPort();
}
/**
* Add a custom request filter which allows to track/modify all requests from browser to server
*
* @param name unique name of filter
* @param requestFilter the filter
*/
public void addRequestFilter(String name, RequestFilter requestFilter) {
if (isRequestFilterAdded(name)) {
throw new IllegalArgumentException("Duplicate request filter: " + name);
}
proxy.addRequestFilter(requestFilter);
requestFilters.put(name, requestFilter);
}
private boolean isRequestFilterAdded(String name) {
return requestFilters.containsKey(name);
}
/**
* Add a custom response filter which allows to track/modify all server responses to browser
*
* @param name unique name of filter
* @param responseFilter the filter
*/
public void addResponseFilter(String name, ResponseFilter responseFilter) {
if (responseFilters.containsKey(name)) {
throw new IllegalArgumentException("Duplicate response filter: " + name);
}
proxy.addResponseFilter(responseFilter);
responseFilters.put(name, responseFilter);
}
static InetSocketAddress getProxyAddress(Proxy proxy) {
String httpProxy = proxy.getHttpProxy();
String host = httpProxy.replaceFirst("(.*):.*", "$1");
String port = httpProxy.replaceFirst(".*:(.*)", "$1");
return new InetSocketAddress(host, parseInt(port));
}
/**
* Converts this proxy to a "selenium" proxy that can be used by webdriver
*/
public Proxy createSeleniumProxy() {
return isEmpty(Configuration.proxyHost)
? ClientUtil.createSeleniumProxy(proxy)
: ClientUtil.createSeleniumProxy(proxy, inetAddressResolver.getInetAddressByName(Configuration.proxyHost));
}
/**
* Stop the server
*/
public void shutdown() {
proxy.abort();
}
/**
* Method return current instance of browser mob proxy
*
* @return browser mob proxy instance
*/
public BrowserMobProxy getProxy() {
return proxy;
}
@Override
public String toString() {
return String.format("Selenide proxy server :%s", port);
}
/**
* Get request filter by name
*/
@SuppressWarnings("unchecked")
public <T extends RequestFilter> T requestFilter(String name) {
return (T) requestFilters.get(name);
}
/**
* Get response filter by name
*
* By default, the only one filter "download" is available.
*/
@SuppressWarnings("unchecked")
public <T extends ResponseFilter> T responseFilter(String name) {
return (T) responseFilters.get(name);
}
}