Tests: Ensure HTTPClient does not follow redirects after post
Relates elastic/x-pack-elasticsearch#470 Original commit: elastic/x-pack-elasticsearch@5333a65c0e
This commit is contained in:
parent
9a7c28786a
commit
463c337d62
|
@ -113,10 +113,12 @@ public class MockWebServer implements Closeable {
|
||||||
byte[] responseAsBytes = response.getBody().getBytes(StandardCharsets.UTF_8);
|
byte[] responseAsBytes = response.getBody().getBytes(StandardCharsets.UTF_8);
|
||||||
s.sendResponseHeaders(response.getStatusCode(), responseAsBytes.length);
|
s.sendResponseHeaders(response.getStatusCode(), responseAsBytes.length);
|
||||||
sleepIfNeeded(response.getBodyDelay());
|
sleepIfNeeded(response.getBodyDelay());
|
||||||
|
if ("HEAD".equals(request.getMethod()) == false) {
|
||||||
try (OutputStream responseBody = s.getResponseBody()) {
|
try (OutputStream responseBody = s.getResponseBody()) {
|
||||||
responseBody.write(responseAsBytes);
|
responseBody.write(responseAsBytes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logger.error((Supplier<?>) () -> new ParameterizedMessage("failed to respond to request [{} {}]",
|
logger.error((Supplier<?>) () -> new ParameterizedMessage("failed to respond to request [{} {}]",
|
||||||
s.getRequestMethod(), s.getRequestURI()), e);
|
s.getRequestMethod(), s.getRequestURI()), e);
|
||||||
|
|
|
@ -447,4 +447,40 @@ public class HttpClientTests extends ESTestCase {
|
||||||
IOException e = expectThrows(IOException.class, () -> httpClient.execute(requestBuilder.build()));
|
IOException e = expectThrows(IOException.class, () -> httpClient.execute(requestBuilder.build()));
|
||||||
assertThat(e.getMessage(), startsWith("Maximum limit of"));
|
assertThat(e.getMessage(), startsWith("Maximum limit of"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testThatGetRedirectIsFollowed() throws Exception {
|
||||||
|
String redirectUrl = "http://" + webServer.getHostName() + ":" + webServer.getPort() + "/foo";
|
||||||
|
webServer.enqueue(new MockResponse().setResponseCode(302).addHeader("Location", redirectUrl));
|
||||||
|
HttpMethod method = randomFrom(HttpMethod.GET, HttpMethod.HEAD);
|
||||||
|
|
||||||
|
if (method == HttpMethod.GET) {
|
||||||
|
webServer.enqueue(new MockResponse().setResponseCode(200).setBody("shouldBeRead"));
|
||||||
|
} else if (method == HttpMethod.HEAD) {
|
||||||
|
webServer.enqueue(new MockResponse().setResponseCode(200));
|
||||||
|
}
|
||||||
|
|
||||||
|
HttpRequest request = HttpRequest.builder("localhost", webServer.getPort()).path("/")
|
||||||
|
.method(method)
|
||||||
|
.build();
|
||||||
|
HttpResponse response = httpClient.execute(request);
|
||||||
|
|
||||||
|
assertThat(webServer.requests(), hasSize(2));
|
||||||
|
if (method == HttpMethod.GET) {
|
||||||
|
assertThat(response.body().utf8ToString(), is("shouldBeRead"));
|
||||||
|
} else if (method == HttpMethod.HEAD) {
|
||||||
|
assertThat(response.body(), is(nullValue()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// not allowed by RFC, only allowed for GET or HEAD
|
||||||
|
public void testThatPostRedirectIsNotFollowed() throws Exception {
|
||||||
|
String redirectUrl = "http://" + webServer.getHostName() + ":" + webServer.getPort() + "/foo";
|
||||||
|
webServer.enqueue(new MockResponse().setResponseCode(302).addHeader("Location", redirectUrl));
|
||||||
|
webServer.enqueue(new MockResponse().setResponseCode(200).setBody("shouldNeverBeRead"));
|
||||||
|
|
||||||
|
HttpRequest request = HttpRequest.builder("localhost", webServer.getPort()).path("/").method(HttpMethod.POST).build();
|
||||||
|
HttpResponse response = httpClient.execute(request);
|
||||||
|
assertThat(response.body(), is(nullValue()));
|
||||||
|
assertThat(webServer.requests(), hasSize(1));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue