Skip to content

Commit

Permalink
#2617 User can safely add the same proxy filter many times
Browse files Browse the repository at this point in the history
it's convenient to store a filter into a constant, and add it before every `open(url)` - without checking if it was already added earlier.

```
var MY_CONSTANT_LOGGER = new RequestFilter() {...}
getSelenideProxy().addRequestFilter("request-logger", MY_CONSTANT_LOGGER);
```
  • Loading branch information
asolntsev committed Jan 29, 2024
1 parent 91b3706 commit 494e796
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 10 deletions.
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
package integration.proxy;

import com.browserup.bup.filters.RequestFilter;
import com.browserup.bup.filters.ResponseFilter;
import com.codeborne.selenide.Configuration;
import com.codeborne.selenide.proxy.SelenideProxyServer;
import integration.ProxyIntegrationTest;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;
Expand All @@ -19,8 +23,10 @@
import static com.codeborne.selenide.proxy.RequestMatchers.urlEndsWith;
import static java.util.Objects.requireNonNull;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

final class ProxyServerUsageTest extends ProxyIntegrationTest {
private static final Logger log = LoggerFactory.getLogger(ProxyServerUsageTest.class);
private final List<String> requests = new ArrayList<>();
private final List<String> responses = new ArrayList<>();

Expand Down Expand Up @@ -87,6 +93,67 @@ private String mockedResponse() {
return "<html><body><h1>This is a fake response</h1></body></html>";
}

@Test
void canAddSameRequestFilterMultipleTimes() {
openFile("file_upload_form.html");
SelenideProxyServer selenideProxy = getSelenideProxy();
RequestFilter requestLogger = (request, contents, messageInfo) -> {
log.info("Request {} {}", messageInfo.getUrl(), contents.getTextContents());
return null;
};

selenideProxy.addRequestFilter("proxy-usages.request-logger", requestLogger);
selenideProxy.addRequestFilter("proxy-usages.request-logger", requestLogger);
}

@Test
void canAddSameResponseFilterMultipleTimes() {
openFile("file_upload_form.html");
SelenideProxyServer selenideProxy = getSelenideProxy();
ResponseFilter responseFilter = (response, contents, messageInfo) -> {
log.info("Response {} {}", messageInfo.getUrl(), contents.getTextContents());
};

selenideProxy.addResponseFilter("proxy-usages.response-logger", responseFilter);
selenideProxy.addResponseFilter("proxy-usages.response-logger", responseFilter);
}

@Test
void cannotAddDifferentRequestFiltersWithSameName() {
openFile("file_upload_form.html");
SelenideProxyServer selenideProxy = getSelenideProxy();
RequestFilter requestLogger1 = (request, contents, messageInfo) -> {
log.info("Request {} {}", messageInfo.getUrl(), contents.getTextContents());
return null;
};
RequestFilter requestLogger2 = (request, contents, messageInfo) -> {
log.info("Request {} {}", messageInfo.getUrl(), contents.getTextContents());
return null;
};

selenideProxy.addRequestFilter("proxy-usages.auth-request", requestLogger1);
assertThatThrownBy(() -> selenideProxy.addRequestFilter("proxy-usages.auth-request", requestLogger2))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("Duplicate request filter: proxy-usages.auth-request");
}

@Test
void cannotAddDifferentResponseFiltersWithSameName() {
openFile("file_upload_form.html");
SelenideProxyServer selenideProxy = getSelenideProxy();
ResponseFilter responseLogger1 = (request, contents, messageInfo) -> {
log.info("Response {} {}", messageInfo.getUrl(), contents.getTextContents());
};
ResponseFilter responseLogger2 = (request, contents, messageInfo) -> {
log.info("Response {} {}", messageInfo.getUrl(), contents.getTextContents());
};

selenideProxy.addResponseFilter("proxy-usages.auth-response", responseLogger1);
assertThatThrownBy(() -> selenideProxy.addResponseFilter("proxy-usages.auth-response", responseLogger2))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("Duplicate response filter: proxy-usages.auth-response");
}

private boolean isBrowserOwnTechnicalRequest(String url) {
return !url.startsWith(Configuration.baseUrl) || url.contains("/favicon.ico");
}
Expand Down
22 changes: 12 additions & 10 deletions src/main/java/com/codeborne/selenide/proxy/SelenideProxyServer.java
Original file line number Diff line number Diff line change
Expand Up @@ -116,15 +116,14 @@ public boolean isStarted() {
* @param requestFilter the filter
*/
public void addRequestFilter(String name, RequestFilter requestFilter) {
if (isRequestFilterAdded(name)) {
RequestFilter currentFilter = requestFilter(name);
if (currentFilter != null && !currentFilter.equals(requestFilter)) {
throw new IllegalArgumentException("Duplicate request filter: " + name);
}
proxy.addRequestFilter(requestFilter);
requestFilters.put(name, requestFilter);
}

private boolean isRequestFilterAdded(String name) {
return requestFilters.containsKey(name);
if (currentFilter == null) {
proxy.addRequestFilter(requestFilter);
requestFilters.put(name, requestFilter);
}
}

/**
Expand All @@ -134,11 +133,14 @@ private boolean isRequestFilterAdded(String name) {
* @param responseFilter the filter
*/
public void addResponseFilter(String name, ResponseFilter responseFilter) {
if (responseFilters.containsKey(name)) {
ResponseFilter currentFilter = responseFilter(name);
if (currentFilter != null && !currentFilter.equals(responseFilter)) {
throw new IllegalArgumentException("Duplicate response filter: " + name);
}
proxy.addResponseFilter(responseFilter);
responseFilters.put(name, responseFilter);
if (currentFilter == null) {
proxy.addResponseFilter(responseFilter);
responseFilters.put(name, responseFilter);
}
}

static InetSocketAddress getProxyAddress(Proxy proxy) {
Expand Down

0 comments on commit 494e796

Please sign in to comment.