Skip to content

Commit 968a87a

Browse files
committed
[cdp] Fetch.requestPaused doesn't handle redirects well
If we can't retrieve the body of the request, don't abandon hope, just abandon getting the body of the response.
1 parent a4f8c86 commit 968a87a

File tree

5 files changed

+107
-15
lines changed

5 files changed

+107
-15
lines changed

java/src/org/openqa/selenium/devtools/idealized/Network.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,10 @@ protected HttpResponse createHttpResponse(
245245
Boolean bodyIsBase64Encoded,
246246
List<Map.Entry<String, String>> headers) {
247247
Supplier<InputStream> content;
248-
if (bodyIsBase64Encoded != null && bodyIsBase64Encoded) {
248+
249+
if (body == null) {
250+
content = Contents.empty();
251+
} else if (bodyIsBase64Encoded != null && bodyIsBase64Encoded) {
249252
byte[] decoded = Base64.getDecoder().decode(body);
250253
content = () -> new ByteArrayInputStream(decoded);
251254
} else {

java/src/org/openqa/selenium/devtools/v85/V85Network.java

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.openqa.selenium.UsernameAndPassword;
2323
import org.openqa.selenium.devtools.Command;
2424
import org.openqa.selenium.devtools.DevTools;
25+
import org.openqa.selenium.devtools.DevToolsException;
2526
import org.openqa.selenium.devtools.Event;
2627
import org.openqa.selenium.devtools.idealized.Network;
2728
import org.openqa.selenium.devtools.v85.fetch.Fetch;
@@ -45,9 +46,14 @@
4546
import java.util.List;
4647
import java.util.Map;
4748
import java.util.Optional;
49+
import java.util.logging.Logger;
50+
51+
import static java.net.HttpURLConnection.HTTP_OK;
4852

4953
public class V85Network extends Network<AuthRequired, RequestPaused> {
5054

55+
private static final Logger LOG = Logger.getLogger(V85Network.class.getName());
56+
5157
public V85Network(DevTools devTools) {
5258
super(devTools);
5359
}
@@ -117,16 +123,32 @@ public Event<RequestPaused> requestPausedEvent() {
117123
@Override
118124
public Either<HttpRequest, HttpResponse> createSeMessages(RequestPaused pausedReq) {
119125
if (pausedReq.getResponseStatusCode().isPresent() || pausedReq.getResponseErrorReason().isPresent()) {
120-
Fetch.GetResponseBodyResponse base64Body = devTools.send(Fetch.getResponseBody(pausedReq.getRequestId()));
126+
String body;
127+
boolean bodyIsBase64Encoded;
128+
129+
try {
130+
Fetch.GetResponseBodyResponse base64Body = devTools.send(Fetch.getResponseBody(pausedReq.getRequestId()));
131+
body = base64Body.getBody();
132+
bodyIsBase64Encoded = base64Body.getBase64Encoded() != null && base64Body.getBase64Encoded();
133+
} catch (DevToolsException e) {
134+
// Redirects don't seem to have bodies
135+
int code = pausedReq.getResponseStatusCode().orElse(HTTP_OK);
136+
if (code < 300 && code > 399) {
137+
LOG.warning("Unable to get body for request id " + pausedReq.getRequestId());
138+
}
139+
140+
body = null;
141+
bodyIsBase64Encoded = false;
142+
}
121143

122144
List<Map.Entry<String, String>> headers = new LinkedList<>();
123145
pausedReq.getResponseHeaders().ifPresent(resHeaders ->
124146
resHeaders.forEach(header -> headers.add(new AbstractMap.SimpleEntry<>(header.getName(), header.getValue()))));
125147

126148
HttpResponse res = createHttpResponse(
127149
pausedReq.getResponseStatusCode(),
128-
base64Body.getBody(),
129-
base64Body.getBase64Encoded(),
150+
body,
151+
bodyIsBase64Encoded,
130152
headers);
131153

132154
return Either.right(res);
@@ -142,7 +164,6 @@ public Either<HttpRequest, HttpResponse> createSeMessages(RequestPaused pausedRe
142164

143165
return Either.left(req);
144166
}
145-
146167
@Override
147168
protected String getRequestId(RequestPaused pausedReq) {
148169
return pausedReq.getRequestId().toString();

java/src/org/openqa/selenium/devtools/v92/V92Network.java

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.openqa.selenium.UsernameAndPassword;
2323
import org.openqa.selenium.devtools.Command;
2424
import org.openqa.selenium.devtools.DevTools;
25+
import org.openqa.selenium.devtools.DevToolsException;
2526
import org.openqa.selenium.devtools.Event;
2627
import org.openqa.selenium.devtools.idealized.Network;
2728
import org.openqa.selenium.devtools.v92.fetch.Fetch;
@@ -45,9 +46,14 @@
4546
import java.util.List;
4647
import java.util.Map;
4748
import java.util.Optional;
49+
import java.util.logging.Logger;
50+
51+
import static java.net.HttpURLConnection.HTTP_OK;
4852

4953
public class V92Network extends Network<AuthRequired, RequestPaused> {
5054

55+
private static final Logger LOG = Logger.getLogger(V92Network.class.getName());
56+
5157
public V92Network(DevTools devTools) {
5258
super(devTools);
5359
}
@@ -117,16 +123,32 @@ public Event<RequestPaused> requestPausedEvent() {
117123
@Override
118124
public Either<HttpRequest, HttpResponse> createSeMessages(RequestPaused pausedReq) {
119125
if (pausedReq.getResponseStatusCode().isPresent() || pausedReq.getResponseErrorReason().isPresent()) {
120-
Fetch.GetResponseBodyResponse base64Body = devTools.send(Fetch.getResponseBody(pausedReq.getRequestId()));
126+
String body;
127+
boolean bodyIsBase64Encoded;
128+
129+
try {
130+
Fetch.GetResponseBodyResponse base64Body = devTools.send(Fetch.getResponseBody(pausedReq.getRequestId()));
131+
body = base64Body.getBody();
132+
bodyIsBase64Encoded = base64Body.getBase64Encoded() != null && base64Body.getBase64Encoded();
133+
} catch (DevToolsException e) {
134+
// Redirects don't seem to have bodies
135+
int code = pausedReq.getResponseStatusCode().orElse(HTTP_OK);
136+
if (code < 300 && code > 399) {
137+
LOG.warning("Unable to get body for request id " + pausedReq.getRequestId());
138+
}
139+
140+
body = null;
141+
bodyIsBase64Encoded = false;
142+
}
121143

122144
List<Map.Entry<String, String>> headers = new LinkedList<>();
123145
pausedReq.getResponseHeaders().ifPresent(resHeaders ->
124146
resHeaders.forEach(header -> headers.add(new AbstractMap.SimpleEntry<>(header.getName(), header.getValue()))));
125147

126148
HttpResponse res = createHttpResponse(
127149
pausedReq.getResponseStatusCode(),
128-
base64Body.getBody(),
129-
base64Body.getBase64Encoded(),
150+
body,
151+
bodyIsBase64Encoded,
130152
headers);
131153

132154
return Either.right(res);

java/src/org/openqa/selenium/devtools/v93/V93Network.java

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.openqa.selenium.UsernameAndPassword;
2323
import org.openqa.selenium.devtools.Command;
2424
import org.openqa.selenium.devtools.DevTools;
25+
import org.openqa.selenium.devtools.DevToolsException;
2526
import org.openqa.selenium.devtools.Event;
2627
import org.openqa.selenium.devtools.idealized.Network;
2728
import org.openqa.selenium.devtools.v93.fetch.Fetch;
@@ -45,9 +46,14 @@
4546
import java.util.List;
4647
import java.util.Map;
4748
import java.util.Optional;
49+
import java.util.logging.Logger;
50+
51+
import static java.net.HttpURLConnection.HTTP_OK;
4852

4953
public class V93Network extends Network<AuthRequired, RequestPaused> {
5054

55+
private static final Logger LOG = Logger.getLogger(V93Network.class.getName());
56+
5157
public V93Network(DevTools devTools) {
5258
super(devTools);
5359
}
@@ -117,16 +123,32 @@ public Event<RequestPaused> requestPausedEvent() {
117123
@Override
118124
public Either<HttpRequest, HttpResponse> createSeMessages(RequestPaused pausedReq) {
119125
if (pausedReq.getResponseStatusCode().isPresent() || pausedReq.getResponseErrorReason().isPresent()) {
120-
Fetch.GetResponseBodyResponse base64Body = devTools.send(Fetch.getResponseBody(pausedReq.getRequestId()));
126+
String body;
127+
boolean bodyIsBase64Encoded;
128+
129+
try {
130+
Fetch.GetResponseBodyResponse base64Body = devTools.send(Fetch.getResponseBody(pausedReq.getRequestId()));
131+
body = base64Body.getBody();
132+
bodyIsBase64Encoded = base64Body.getBase64Encoded() != null && base64Body.getBase64Encoded();
133+
} catch (DevToolsException e) {
134+
// Redirects don't seem to have bodies
135+
int code = pausedReq.getResponseStatusCode().orElse(HTTP_OK);
136+
if (code < 300 && code > 399) {
137+
LOG.warning("Unable to get body for request id " + pausedReq.getRequestId());
138+
}
139+
140+
body = null;
141+
bodyIsBase64Encoded = false;
142+
}
121143

122144
List<Map.Entry<String, String>> headers = new LinkedList<>();
123145
pausedReq.getResponseHeaders().ifPresent(resHeaders ->
124146
resHeaders.forEach(header -> headers.add(new AbstractMap.SimpleEntry<>(header.getName(), header.getValue()))));
125147

126148
HttpResponse res = createHttpResponse(
127149
pausedReq.getResponseStatusCode(),
128-
base64Body.getBody(),
129-
base64Body.getBase64Encoded(),
150+
body,
151+
bodyIsBase64Encoded,
130152
headers);
131153

132154
return Either.right(res);

java/test/org/openqa/selenium/support/devtools/NetworkInterceptorTest.java

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,11 @@
3434

3535
import java.util.concurrent.atomic.AtomicBoolean;
3636

37+
import static com.google.common.net.MediaType.XHTML_UTF_8;
38+
import static java.net.HttpURLConnection.HTTP_MOVED_TEMP;
3739
import static java.net.HttpURLConnection.HTTP_NOT_FOUND;
3840
import static org.assertj.core.api.Assertions.assertThat;
41+
import static org.assertj.core.api.Assertions.fail;
3942
import static org.assertj.core.api.Assumptions.assumeThat;
4043
import static org.openqa.selenium.remote.http.Contents.utf8String;
4144
import static org.openqa.selenium.testing.Safely.safelyCall;
@@ -59,10 +62,19 @@ public void setup() {
5962
assumeThat(driver).isInstanceOf(HasDevTools.class);
6063
assumeThat(isFirefoxVersionOlderThan(87, driver)).isFalse();
6164

62-
appServer = new NettyAppServer(req -> new HttpResponse()
63-
.setStatus(200)
64-
.addHeader("Content-Type", MediaType.XHTML_UTF_8.toString())
65-
.setContent(utf8String("<html><head><title>Hello, World!</title></head><body/></html>")));
65+
Route route = Route.combine(
66+
Route.matching(req -> true)
67+
.to(() -> req -> new HttpResponse()
68+
.setStatus(200)
69+
.addHeader("Content-Type", XHTML_UTF_8.toString())
70+
.setContent(utf8String("<html><head><title>Hello, World!</title></head><body/></html>"))),
71+
Route.get("/redirect")
72+
.to(() -> req -> new HttpResponse()
73+
.setStatus(HTTP_MOVED_TEMP)
74+
.setHeader("Location", "/cheese")
75+
.setContent(Contents.utf8String("Delicious"))));
76+
77+
appServer = new NettyAppServer(route);
6678
appServer.start();
6779
}
6880

@@ -159,4 +171,16 @@ public void shouldBeAbleToInterceptAResponse() {
159171
String body = driver.findElement(By.tagName("body")).getText();
160172
assertThat(body).contains("Sausages");
161173
}
174+
175+
@Test
176+
public void shouldHandleRedirects() {
177+
try (NetworkInterceptor networkInterceptor = new NetworkInterceptor(
178+
driver,
179+
(Filter) next -> next::execute)) {
180+
driver.get(appServer.whereIs("/redirect"));
181+
182+
String body = driver.findElement(By.tagName("body")).getText();
183+
assertThat(body).contains("Hello, World!");
184+
}
185+
}
162186
}

0 commit comments

Comments
 (0)