aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2017-08-04 21:23:57 +0200
committerGravatar Jakob Buchgraber <buchgr@google.com>2017-08-07 11:22:16 +0200
commit583fa511a1916b81aeeaa0c31126986a382c718b (patch)
tree41037cab50fb1b46f80b744212a9a5972cc824f9
parent4928abff40ca37271973589489dc5015e44c88c0 (diff)
fix for bazel 303 redirect bug: https://github.com/bazelbuild/bazel/issues/3343
manually turn off HTTP internal reconnection so HTTP can utilize MAX_REDIRECTS, etc. RELNOTES: None. PiperOrigin-RevId: 164294282
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpConnector.java3
-rw-r--r--src/test/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpConnectorTest.java33
2 files changed, 30 insertions, 6 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpConnector.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpConnector.java
index dacd93ae08..cff3cdf2a4 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpConnector.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpConnector.java
@@ -94,6 +94,7 @@ class HttpConnector {
boolean isAlreadyCompressed =
COMPRESSED_EXTENSIONS.contains(HttpUtils.getExtension(url.getPath()))
|| COMPRESSED_EXTENSIONS.contains(HttpUtils.getExtension(originalUrl.getPath()));
+ connection.setInstanceFollowRedirects(false);
for (Map.Entry<String, String> entry : requestHeaders.entrySet()) {
if (isAlreadyCompressed && Ascii.equalsIgnoreCase(entry.getKey(), "Accept-Encoding")) {
// We're not going to ask for compression if we're downloading a file that already
@@ -132,7 +133,7 @@ class HttpConnector {
// 206 means partial content and only happens if caller specified Range. See RFC7233 ยง 4.1.
if (code == 200 || code == 206) {
return connection;
- } else if (code == 301 || code == 302 || code == 307) {
+ } else if (code == 301 || code == 302 || code == 303 || code == 307) {
readAllBytesAndClose(connection.getInputStream());
if (++redirects == MAX_REDIRECTS) {
eventHandler.handle(Event.progress("Redirect loop detected in " + originalUrl));
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpConnectorTest.java b/src/test/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpConnectorTest.java
index d6a1c77975..e151340a13 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpConnectorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/repository/downloader/HttpConnectorTest.java
@@ -355,7 +355,30 @@ public class HttpConnectorTest {
}
@Test
- public void redirectToDifferentPath_works() throws Exception {
+ public void pathRedirect_301() throws Exception {
+ redirectToDifferentPath_works("301");
+ }
+
+ @Test
+ public void serverRedirect_301() throws Exception {
+ redirectToDifferentServer_works("301");
+ }
+
+ /*
+ * Also tests behavior for 302 and 307 codes.
+ */
+ @Test
+ public void pathRedirect_303() throws Exception {
+ redirectToDifferentPath_works("303");
+ }
+
+ @Test
+ public void serverRedirects_303() throws Exception {
+ redirectToDifferentServer_works("303");
+ }
+
+ public void redirectToDifferentPath_works(String code) throws Exception {
+ String redirectCode = "HTTP/1.1 " + code + " Redirect";
final Map<String, String> headers1 = new ConcurrentHashMap<>();
final Map<String, String> headers2 = new ConcurrentHashMap<>();
try (ServerSocket server = new ServerSocket(0, 1, InetAddress.getByName(null))) {
@@ -369,7 +392,7 @@ public class HttpConnectorTest {
readHttpRequest(socket.getInputStream(), headers1);
sendLines(
socket,
- "HTTP/1.1 301 Redirect",
+ redirectCode,
"Date: Fri, 31 Dec 1999 23:59:59 GMT",
"Connection: close",
"Location: /doodle.tar.gz",
@@ -406,8 +429,8 @@ public class HttpConnectorTest {
assertThat(headers2).containsEntry("x-request-uri", "/doodle.tar.gz");
}
- @Test
- public void redirectToDifferentServer_works() throws Exception {
+ public void redirectToDifferentServer_works(String code) throws Exception {
+ String redirectCode = "HTTP/1.1 " + code + " Redirect";
try (ServerSocket server1 = new ServerSocket(0, 1, InetAddress.getByName(null));
ServerSocket server2 = new ServerSocket(0, 1, InetAddress.getByName(null))) {
@SuppressWarnings("unused")
@@ -420,7 +443,7 @@ public class HttpConnectorTest {
readHttpRequest(socket.getInputStream());
sendLines(
socket,
- "HTTP/1.1 301 Redirect",
+ redirectCode,
"Date: Fri, 31 Dec 1999 23:59:59 GMT",
"Connection: close",
String.format(