|
|
@@ -50,19 +50,17 @@ import org.mockito.ArgumentCaptor;
|
|
|
import java.io.IOException;
|
|
|
import java.nio.channels.ClosedChannelException;
|
|
|
import java.nio.charset.StandardCharsets;
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.Arrays;
|
|
|
import java.util.Collections;
|
|
|
-import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
import java.util.Objects;
|
|
|
-import java.util.function.Supplier;
|
|
|
|
|
|
+import static org.hamcrest.Matchers.containsInAnyOrder;
|
|
|
import static org.hamcrest.Matchers.equalTo;
|
|
|
import static org.hamcrest.Matchers.hasItem;
|
|
|
import static org.hamcrest.Matchers.instanceOf;
|
|
|
import static org.hamcrest.Matchers.not;
|
|
|
+import static org.hamcrest.Matchers.nullValue;
|
|
|
import static org.mockito.Matchers.any;
|
|
|
import static org.mockito.Mockito.atLeastOnce;
|
|
|
import static org.mockito.Mockito.mock;
|
|
|
@@ -90,109 +88,72 @@ public class DefaultRestChannelTests extends ESTestCase {
|
|
|
}
|
|
|
|
|
|
public void testResponse() {
|
|
|
- final TestResponse response = executeRequest(Settings.EMPTY, "request-host");
|
|
|
+ final TestHttpResponse response = executeRequest(Settings.EMPTY, "request-host");
|
|
|
assertThat(response.content(), equalTo(new TestRestResponse().content()));
|
|
|
}
|
|
|
|
|
|
- // TODO: Enable these Cors tests when the Cors logic lives in :server
|
|
|
-
|
|
|
-// public void testCorsEnabledWithoutAllowOrigins() {
|
|
|
-// // Set up an HTTP transport with only the CORS enabled setting
|
|
|
-// Settings settings = Settings.builder()
|
|
|
-// .put(HttpTransportSettings.SETTING_CORS_ENABLED.getKey(), true)
|
|
|
-// .build();
|
|
|
-// HttpResponse response = executeRequest(settings, "remote-host", "request-host");
|
|
|
-// // inspect response and validate
|
|
|
-// assertThat(response.headers().get(HttpHeaderNames.ACCESS_CONTROL_ALLOW_ORIGIN), nullValue());
|
|
|
-// }
|
|
|
-//
|
|
|
-// public void testCorsEnabledWithAllowOrigins() {
|
|
|
-// final String originValue = "remote-host";
|
|
|
-// // create an HTTP transport with CORS enabled and allow origin configured
|
|
|
-// Settings settings = Settings.builder()
|
|
|
-// .put(SETTING_CORS_ENABLED.getKey(), true)
|
|
|
-// .put(SETTING_CORS_ALLOW_ORIGIN.getKey(), originValue)
|
|
|
-// .build();
|
|
|
-// HttpResponse response = executeRequest(settings, originValue, "request-host");
|
|
|
-// // inspect response and validate
|
|
|
-// assertThat(response.headers().get(HttpHeaderNames.ACCESS_CONTROL_ALLOW_ORIGIN), notNullValue());
|
|
|
-// String allowedOrigins = response.headers().get(HttpHeaderNames.ACCESS_CONTROL_ALLOW_ORIGIN);
|
|
|
-// assertThat(allowedOrigins, is(originValue));
|
|
|
-// }
|
|
|
-//
|
|
|
-// public void testCorsAllowOriginWithSameHost() {
|
|
|
-// String originValue = "remote-host";
|
|
|
-// String host = "remote-host";
|
|
|
-// // create an HTTP transport with CORS enabled
|
|
|
-// Settings settings = Settings.builder()
|
|
|
-// .put(SETTING_CORS_ENABLED.getKey(), true)
|
|
|
-// .build();
|
|
|
-// HttpResponse response = executeRequest(settings, originValue, host);
|
|
|
-// // inspect response and validate
|
|
|
-// assertThat(response.headers().get(HttpHeaderNames.ACCESS_CONTROL_ALLOW_ORIGIN), notNullValue());
|
|
|
-// String allowedOrigins = response.headers().get(HttpHeaderNames.ACCESS_CONTROL_ALLOW_ORIGIN);
|
|
|
-// assertThat(allowedOrigins, is(originValue));
|
|
|
-//
|
|
|
-// originValue = "http://" + originValue;
|
|
|
-// response = executeRequest(settings, originValue, host);
|
|
|
-// assertThat(response.headers().get(HttpHeaderNames.ACCESS_CONTROL_ALLOW_ORIGIN), notNullValue());
|
|
|
-// allowedOrigins = response.headers().get(HttpHeaderNames.ACCESS_CONTROL_ALLOW_ORIGIN);
|
|
|
-// assertThat(allowedOrigins, is(originValue));
|
|
|
-//
|
|
|
-// originValue = originValue + ":5555";
|
|
|
-// host = host + ":5555";
|
|
|
-// response = executeRequest(settings, originValue, host);
|
|
|
-// assertThat(response.headers().get(HttpHeaderNames.ACCESS_CONTROL_ALLOW_ORIGIN), notNullValue());
|
|
|
-// allowedOrigins = response.headers().get(HttpHeaderNames.ACCESS_CONTROL_ALLOW_ORIGIN);
|
|
|
-// assertThat(allowedOrigins, is(originValue));
|
|
|
-//
|
|
|
-// originValue = originValue.replace("http", "https");
|
|
|
-// response = executeRequest(settings, originValue, host);
|
|
|
-// assertThat(response.headers().get(HttpHeaderNames.ACCESS_CONTROL_ALLOW_ORIGIN), notNullValue());
|
|
|
-// allowedOrigins = response.headers().get(HttpHeaderNames.ACCESS_CONTROL_ALLOW_ORIGIN);
|
|
|
-// assertThat(allowedOrigins, is(originValue));
|
|
|
-// }
|
|
|
-//
|
|
|
-// public void testThatStringLiteralWorksOnMatch() {
|
|
|
-// final String originValue = "remote-host";
|
|
|
-// Settings settings = Settings.builder()
|
|
|
-// .put(SETTING_CORS_ENABLED.getKey(), true)
|
|
|
-// .put(SETTING_CORS_ALLOW_ORIGIN.getKey(), originValue)
|
|
|
-// .put(SETTING_CORS_ALLOW_METHODS.getKey(), "get, options, post")
|
|
|
-// .put(SETTING_CORS_ALLOW_CREDENTIALS.getKey(), true)
|
|
|
-// .build();
|
|
|
-// HttpResponse response = executeRequest(settings, originValue, "request-host");
|
|
|
-// // inspect response and validate
|
|
|
-// assertThat(response.headers().get(HttpHeaderNames.ACCESS_CONTROL_ALLOW_ORIGIN), notNullValue());
|
|
|
-// String allowedOrigins = response.headers().get(HttpHeaderNames.ACCESS_CONTROL_ALLOW_ORIGIN);
|
|
|
-// assertThat(allowedOrigins, is(originValue));
|
|
|
-// assertThat(response.headers().get(HttpHeaderNames.ACCESS_CONTROL_ALLOW_CREDENTIALS), equalTo("true"));
|
|
|
-// }
|
|
|
-//
|
|
|
-// public void testThatAnyOriginWorks() {
|
|
|
-// final String originValue = NioCorsHandler.ANY_ORIGIN;
|
|
|
-// Settings settings = Settings.builder()
|
|
|
-// .put(SETTING_CORS_ENABLED.getKey(), true)
|
|
|
-// .put(SETTING_CORS_ALLOW_ORIGIN.getKey(), originValue)
|
|
|
-// .build();
|
|
|
-// HttpResponse response = executeRequest(settings, originValue, "request-host");
|
|
|
-// // inspect response and validate
|
|
|
-// assertThat(response.headers().get(HttpHeaderNames.ACCESS_CONTROL_ALLOW_ORIGIN), notNullValue());
|
|
|
-// String allowedOrigins = response.headers().get(HttpHeaderNames.ACCESS_CONTROL_ALLOW_ORIGIN);
|
|
|
-// assertThat(allowedOrigins, is(originValue));
|
|
|
-// assertThat(response.headers().get(HttpHeaderNames.ACCESS_CONTROL_ALLOW_CREDENTIALS), nullValue());
|
|
|
-// }
|
|
|
+ public void testCorsEnabledWithoutAllowOrigins() {
|
|
|
+ // Set up an HTTP transport with only the CORS enabled setting
|
|
|
+ Settings settings = Settings.builder()
|
|
|
+ .put(HttpTransportSettings.SETTING_CORS_ENABLED.getKey(), true)
|
|
|
+ .build();
|
|
|
+ TestHttpResponse response = executeRequest(settings, "request-host");
|
|
|
+ assertThat(response.headers().get(CorsHandler.ACCESS_CONTROL_ALLOW_ORIGIN), nullValue());
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testCorsEnabledWithAllowOrigins() {
|
|
|
+ final String originValue = "remote-host";
|
|
|
+ final String pattern;
|
|
|
+ if (randomBoolean()) {
|
|
|
+ pattern = originValue;
|
|
|
+ } else {
|
|
|
+ pattern = "/remote-hos.+/";
|
|
|
+ }
|
|
|
+ // create an HTTP transport with CORS enabled and allow origin configured
|
|
|
+ Settings settings = Settings.builder()
|
|
|
+ .put(HttpTransportSettings.SETTING_CORS_ENABLED.getKey(), true)
|
|
|
+ .put(HttpTransportSettings.SETTING_CORS_ALLOW_ORIGIN.getKey(), pattern)
|
|
|
+ .build();
|
|
|
+ TestHttpResponse response = executeRequest(settings, originValue, "https://127.0.0.1");
|
|
|
+ assertEquals(originValue, response.headers().get(CorsHandler.ACCESS_CONTROL_ALLOW_ORIGIN).get(0));
|
|
|
+ assertThat(response.headers().get(CorsHandler.VARY), containsInAnyOrder(CorsHandler.ORIGIN));
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testCorsEnabledWithAllowOriginsAndAllowCredentials() {
|
|
|
+ final String originValue = "remote-host";
|
|
|
+ // create an HTTP transport with CORS enabled and allow origin configured
|
|
|
+ Settings settings = Settings.builder()
|
|
|
+ .put(HttpTransportSettings.SETTING_CORS_ENABLED.getKey(), true)
|
|
|
+ .put(HttpTransportSettings.SETTING_CORS_ALLOW_ORIGIN.getKey(), CorsHandler.ANY_ORIGIN)
|
|
|
+ .put(HttpTransportSettings.SETTING_CORS_ALLOW_CREDENTIALS.getKey(), true)
|
|
|
+ .build();
|
|
|
+ TestHttpResponse response = executeRequest(settings, originValue, "https://127.0.0.1");
|
|
|
+ assertEquals(originValue, response.headers().get(CorsHandler.ACCESS_CONTROL_ALLOW_ORIGIN).get(0));
|
|
|
+ assertEquals(CorsHandler.ORIGIN, response.headers().get(CorsHandler.VARY).get(0));
|
|
|
+ assertEquals("true", response.headers().get(CorsHandler.ACCESS_CONTROL_ALLOW_CREDENTIALS).get(0));
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testThatAnyOriginWorks() {
|
|
|
+ final String originValue = CorsHandler.ANY_ORIGIN;
|
|
|
+ Settings settings = Settings.builder()
|
|
|
+ .put(HttpTransportSettings.SETTING_CORS_ENABLED.getKey(), true)
|
|
|
+ .put(HttpTransportSettings.SETTING_CORS_ALLOW_ORIGIN.getKey(), originValue)
|
|
|
+ .build();
|
|
|
+ TestHttpResponse response = executeRequest(settings, originValue, "https://127.0.0.1");
|
|
|
+ assertEquals(originValue, response.headers().get(CorsHandler.ACCESS_CONTROL_ALLOW_ORIGIN).get(0));
|
|
|
+ assertNull(response.headers().get(CorsHandler.VARY));
|
|
|
+ }
|
|
|
|
|
|
public void testHeadersSet() {
|
|
|
Settings settings = Settings.builder().build();
|
|
|
- final TestRequest httpRequest = new TestRequest(HttpRequest.HttpVersion.HTTP_1_1, RestRequest.Method.GET, "/");
|
|
|
+ final TestHttpRequest httpRequest = new TestHttpRequest(HttpRequest.HttpVersion.HTTP_1_1, RestRequest.Method.GET, "/");
|
|
|
httpRequest.getHeaders().put(Task.X_OPAQUE_ID, Collections.singletonList("abc"));
|
|
|
final RestRequest request = RestRequest.request(xContentRegistry(), httpRequest, httpChannel);
|
|
|
HttpHandlingSettings handlingSettings = HttpHandlingSettings.fromSettings(settings);
|
|
|
|
|
|
// send a response
|
|
|
DefaultRestChannel channel = new DefaultRestChannel(httpChannel, httpRequest, request, bigArrays, handlingSettings,
|
|
|
- threadPool.getThreadContext(), null);
|
|
|
+ threadPool.getThreadContext(), CorsHandler.fromSettings(settings), null);
|
|
|
TestRestResponse resp = new TestRestResponse();
|
|
|
final String customHeader = "custom-header";
|
|
|
final String customHeaderValue = "xyz";
|
|
|
@@ -200,10 +161,10 @@ public class DefaultRestChannelTests extends ESTestCase {
|
|
|
channel.sendResponse(resp);
|
|
|
|
|
|
// inspect what was written
|
|
|
- ArgumentCaptor<TestResponse> responseCaptor = ArgumentCaptor.forClass(TestResponse.class);
|
|
|
+ ArgumentCaptor<TestHttpResponse> responseCaptor = ArgumentCaptor.forClass(TestHttpResponse.class);
|
|
|
verify(httpChannel).sendResponse(responseCaptor.capture(), any());
|
|
|
- TestResponse httpResponse = responseCaptor.getValue();
|
|
|
- Map<String, List<String>> headers = httpResponse.headers;
|
|
|
+ TestHttpResponse httpResponse = responseCaptor.getValue();
|
|
|
+ Map<String, List<String>> headers = httpResponse.headers();
|
|
|
assertNull(headers.get("non-existent-header"));
|
|
|
assertEquals(customHeaderValue, headers.get(customHeader).get(0));
|
|
|
assertEquals("abc", headers.get(Task.X_OPAQUE_ID).get(0));
|
|
|
@@ -213,21 +174,21 @@ public class DefaultRestChannelTests extends ESTestCase {
|
|
|
|
|
|
public void testCookiesSet() {
|
|
|
Settings settings = Settings.builder().put(HttpTransportSettings.SETTING_HTTP_RESET_COOKIES.getKey(), true).build();
|
|
|
- final TestRequest httpRequest = new TestRequest(HttpRequest.HttpVersion.HTTP_1_1, RestRequest.Method.GET, "/");
|
|
|
+ final TestHttpRequest httpRequest = new TestHttpRequest(HttpRequest.HttpVersion.HTTP_1_1, RestRequest.Method.GET, "/");
|
|
|
httpRequest.getHeaders().put(Task.X_OPAQUE_ID, Collections.singletonList("abc"));
|
|
|
final RestRequest request = RestRequest.request(xContentRegistry(), httpRequest, httpChannel);
|
|
|
HttpHandlingSettings handlingSettings = HttpHandlingSettings.fromSettings(settings);
|
|
|
|
|
|
// send a response
|
|
|
DefaultRestChannel channel = new DefaultRestChannel(httpChannel, httpRequest, request, bigArrays, handlingSettings,
|
|
|
- threadPool.getThreadContext(), null);
|
|
|
+ threadPool.getThreadContext(), CorsHandler.fromSettings(settings), null);
|
|
|
channel.sendResponse(new TestRestResponse());
|
|
|
|
|
|
// inspect what was written
|
|
|
- ArgumentCaptor<TestResponse> responseCaptor = ArgumentCaptor.forClass(TestResponse.class);
|
|
|
+ ArgumentCaptor<TestHttpResponse> responseCaptor = ArgumentCaptor.forClass(TestHttpResponse.class);
|
|
|
verify(httpChannel).sendResponse(responseCaptor.capture(), any());
|
|
|
- TestResponse nioResponse = responseCaptor.getValue();
|
|
|
- Map<String, List<String>> headers = nioResponse.headers;
|
|
|
+ TestHttpResponse nioResponse = responseCaptor.getValue();
|
|
|
+ Map<String, List<String>> headers = nioResponse.headers();
|
|
|
assertThat(headers.get(DefaultRestChannel.SET_COOKIE), hasItem("cookie"));
|
|
|
assertThat(headers.get(DefaultRestChannel.SET_COOKIE), hasItem("cookie2"));
|
|
|
}
|
|
|
@@ -235,12 +196,12 @@ public class DefaultRestChannelTests extends ESTestCase {
|
|
|
@SuppressWarnings("unchecked")
|
|
|
public void testReleaseInListener() throws IOException {
|
|
|
final Settings settings = Settings.builder().build();
|
|
|
- final TestRequest httpRequest = new TestRequest(HttpRequest.HttpVersion.HTTP_1_1, RestRequest.Method.GET, "/");
|
|
|
+ final TestHttpRequest httpRequest = new TestHttpRequest(HttpRequest.HttpVersion.HTTP_1_1, RestRequest.Method.GET, "/");
|
|
|
final RestRequest request = RestRequest.request(xContentRegistry(), httpRequest, httpChannel);
|
|
|
HttpHandlingSettings handlingSettings = HttpHandlingSettings.fromSettings(settings);
|
|
|
|
|
|
DefaultRestChannel channel = new DefaultRestChannel(httpChannel, httpRequest, request, bigArrays, handlingSettings,
|
|
|
- threadPool.getThreadContext(), null);
|
|
|
+ threadPool.getThreadContext(), CorsHandler.fromSettings(settings), null);
|
|
|
final BytesRestResponse response = new BytesRestResponse(RestStatus.INTERNAL_SERVER_ERROR,
|
|
|
JsonXContent.contentBuilder().startObject().endObject());
|
|
|
assertThat(response.content(), not(instanceOf(Releasable.class)));
|
|
|
@@ -276,16 +237,16 @@ public class DefaultRestChannelTests extends ESTestCase {
|
|
|
final boolean brokenRequest = randomBoolean();
|
|
|
final boolean close = brokenRequest || randomBoolean();
|
|
|
if (brokenRequest) {
|
|
|
- httpRequest = new TestRequest(() -> {
|
|
|
+ httpRequest = new TestHttpRequest(() -> {
|
|
|
throw new IllegalArgumentException("Can't parse HTTP version");
|
|
|
}, RestRequest.Method.GET, "/");
|
|
|
} else if (randomBoolean()) {
|
|
|
- httpRequest = new TestRequest(HttpRequest.HttpVersion.HTTP_1_1, RestRequest.Method.GET, "/");
|
|
|
+ httpRequest = new TestHttpRequest(HttpRequest.HttpVersion.HTTP_1_1, RestRequest.Method.GET, "/");
|
|
|
if (close) {
|
|
|
httpRequest.getHeaders().put(DefaultRestChannel.CONNECTION, Collections.singletonList(DefaultRestChannel.CLOSE));
|
|
|
}
|
|
|
} else {
|
|
|
- httpRequest = new TestRequest(HttpRequest.HttpVersion.HTTP_1_0, RestRequest.Method.GET, "/");
|
|
|
+ httpRequest = new TestHttpRequest(HttpRequest.HttpVersion.HTTP_1_0, RestRequest.Method.GET, "/");
|
|
|
if (!close) {
|
|
|
httpRequest.getHeaders().put(DefaultRestChannel.CONNECTION, Collections.singletonList(DefaultRestChannel.KEEP_ALIVE));
|
|
|
}
|
|
|
@@ -295,7 +256,7 @@ public class DefaultRestChannelTests extends ESTestCase {
|
|
|
HttpHandlingSettings handlingSettings = HttpHandlingSettings.fromSettings(settings);
|
|
|
|
|
|
DefaultRestChannel channel = new DefaultRestChannel(httpChannel, httpRequest, request, bigArrays, handlingSettings,
|
|
|
- threadPool.getThreadContext(), null);
|
|
|
+ threadPool.getThreadContext(), CorsHandler.fromSettings(settings), null);
|
|
|
channel.sendResponse(new TestRestResponse());
|
|
|
Class<ActionListener<Void>> listenerClass = (Class<ActionListener<Void>>) (Class) ActionListener.class;
|
|
|
ArgumentCaptor<ActionListener<Void>> listenerCaptor = ArgumentCaptor.forClass(listenerClass);
|
|
|
@@ -317,7 +278,7 @@ public class DefaultRestChannelTests extends ESTestCase {
|
|
|
final boolean close = randomBoolean();
|
|
|
final HttpRequest.HttpVersion httpVersion = close ? HttpRequest.HttpVersion.HTTP_1_0 : HttpRequest.HttpVersion.HTTP_1_1;
|
|
|
final String httpConnectionHeaderValue = close ? DefaultRestChannel.CLOSE : DefaultRestChannel.KEEP_ALIVE;
|
|
|
- final RestRequest request = RestRequest.request(xContentRegistry(), new TestRequest(httpVersion, null, "/") {
|
|
|
+ final RestRequest request = RestRequest.request(xContentRegistry(), new TestHttpRequest(httpVersion, null, "/") {
|
|
|
@Override
|
|
|
public RestRequest.Method method() {
|
|
|
throw new IllegalArgumentException("test");
|
|
|
@@ -326,7 +287,8 @@ public class DefaultRestChannelTests extends ESTestCase {
|
|
|
request.getHttpRequest().getHeaders().put(DefaultRestChannel.CONNECTION, Collections.singletonList(httpConnectionHeaderValue));
|
|
|
|
|
|
DefaultRestChannel channel = new DefaultRestChannel(httpChannel, request.getHttpRequest(), request, bigArrays,
|
|
|
- HttpHandlingSettings.fromSettings(Settings.EMPTY), threadPool.getThreadContext(), null);
|
|
|
+ HttpHandlingSettings.fromSettings(Settings.EMPTY), threadPool.getThreadContext(), CorsHandler.fromSettings(Settings.EMPTY),
|
|
|
+ null);
|
|
|
|
|
|
// ESTestCase#after will invoke ensureAllArraysAreReleased which will fail if the response content was not released
|
|
|
final BigArrays bigArrays = new MockBigArrays(new MockPageCacheRecycler(Settings.EMPTY), new NoneCircuitBreakerService());
|
|
|
@@ -354,7 +316,7 @@ public class DefaultRestChannelTests extends ESTestCase {
|
|
|
final boolean close = randomBoolean();
|
|
|
final HttpRequest.HttpVersion httpVersion = close ? HttpRequest.HttpVersion.HTTP_1_0 : HttpRequest.HttpVersion.HTTP_1_1;
|
|
|
final String httpConnectionHeaderValue = close ? DefaultRestChannel.CLOSE : DefaultRestChannel.KEEP_ALIVE;
|
|
|
- final RestRequest request = RestRequest.request(xContentRegistry(), new TestRequest(httpVersion, null, "/") {
|
|
|
+ final RestRequest request = RestRequest.request(xContentRegistry(), new TestHttpRequest(httpVersion, null, "/") {
|
|
|
@Override
|
|
|
public HttpResponse createResponse(RestStatus status, BytesReference content) {
|
|
|
throw new IllegalArgumentException("test");
|
|
|
@@ -363,7 +325,8 @@ public class DefaultRestChannelTests extends ESTestCase {
|
|
|
request.getHttpRequest().getHeaders().put(DefaultRestChannel.CONNECTION, Collections.singletonList(httpConnectionHeaderValue));
|
|
|
|
|
|
DefaultRestChannel channel = new DefaultRestChannel(httpChannel, request.getHttpRequest(), request, bigArrays,
|
|
|
- HttpHandlingSettings.fromSettings(Settings.EMPTY), threadPool.getThreadContext(), null);
|
|
|
+ HttpHandlingSettings.fromSettings(Settings.EMPTY), threadPool.getThreadContext(), CorsHandler.fromSettings(Settings.EMPTY),
|
|
|
+ null);
|
|
|
|
|
|
// ESTestCase#after will invoke ensureAllArraysAreReleased which will fail if the response content was not released
|
|
|
final BigArrays bigArrays = new MockBigArrays(new MockPageCacheRecycler(Settings.EMPTY), new NoneCircuitBreakerService());
|
|
|
@@ -379,142 +342,29 @@ public class DefaultRestChannelTests extends ESTestCase {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private TestResponse executeRequest(final Settings settings, final String host) {
|
|
|
+ private TestHttpResponse executeRequest(final Settings settings, final String host) {
|
|
|
return executeRequest(settings, null, host);
|
|
|
}
|
|
|
|
|
|
- private TestResponse executeRequest(final Settings settings, final String originValue, final String host) {
|
|
|
- HttpRequest httpRequest = new TestRequest(HttpRequest.HttpVersion.HTTP_1_1, RestRequest.Method.GET, "/");
|
|
|
- // TODO: These exist for the Cors tests
|
|
|
-// if (originValue != null) {
|
|
|
-// httpRequest.headers().add(HttpHeaderNames.ORIGIN, originValue);
|
|
|
-// }
|
|
|
-// httpRequest.headers().add(HttpHeaderNames.HOST, host);
|
|
|
+ private TestHttpResponse executeRequest(final Settings settings, final String originValue, final String host) {
|
|
|
+ HttpRequest httpRequest = new TestHttpRequest(HttpRequest.HttpVersion.HTTP_1_1, RestRequest.Method.GET, "/");
|
|
|
+ if (originValue != null) {
|
|
|
+ httpRequest.getHeaders().put(CorsHandler.ORIGIN, Collections.singletonList(originValue));
|
|
|
+ }
|
|
|
+ httpRequest.getHeaders().put(CorsHandler.HOST, Collections.singletonList(host));
|
|
|
final RestRequest request = RestRequest.request(xContentRegistry(), httpRequest, httpChannel);
|
|
|
|
|
|
HttpHandlingSettings httpHandlingSettings = HttpHandlingSettings.fromSettings(settings);
|
|
|
RestChannel channel = new DefaultRestChannel(httpChannel, httpRequest, request, bigArrays, httpHandlingSettings,
|
|
|
- threadPool.getThreadContext(), null);
|
|
|
+ threadPool.getThreadContext(), new CorsHandler(CorsHandler.buildConfig(settings)), null);
|
|
|
channel.sendResponse(new TestRestResponse());
|
|
|
|
|
|
// get the response
|
|
|
- ArgumentCaptor<TestResponse> responseCaptor = ArgumentCaptor.forClass(TestResponse.class);
|
|
|
+ ArgumentCaptor<TestHttpResponse> responseCaptor = ArgumentCaptor.forClass(TestHttpResponse.class);
|
|
|
verify(httpChannel, atLeastOnce()).sendResponse(responseCaptor.capture(), any());
|
|
|
return responseCaptor.getValue();
|
|
|
}
|
|
|
|
|
|
- private static class TestRequest implements HttpRequest {
|
|
|
-
|
|
|
- private final Supplier<HttpVersion> version;
|
|
|
- private final RestRequest.Method method;
|
|
|
- private final String uri;
|
|
|
- private HashMap<String, List<String>> headers = new HashMap<>();
|
|
|
-
|
|
|
- private TestRequest(Supplier<HttpVersion> versionSupplier, RestRequest.Method method, String uri) {
|
|
|
- this.version = versionSupplier;
|
|
|
- this.method = method;
|
|
|
- this.uri = uri;
|
|
|
- }
|
|
|
-
|
|
|
- private TestRequest(HttpVersion version, RestRequest.Method method, String uri) {
|
|
|
- this(() -> version, method, uri);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public RestRequest.Method method() {
|
|
|
- return method;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public String uri() {
|
|
|
- return uri;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public BytesReference content() {
|
|
|
- return BytesArray.EMPTY;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public Map<String, List<String>> getHeaders() {
|
|
|
- return headers;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public List<String> strictCookies() {
|
|
|
- return Arrays.asList("cookie", "cookie2");
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public HttpVersion protocolVersion() {
|
|
|
- return version.get();
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public HttpRequest removeHeader(String header) {
|
|
|
- throw new UnsupportedOperationException("Do not support removing header on test request.");
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public HttpResponse createResponse(RestStatus status, BytesReference content) {
|
|
|
- return new TestResponse(status, content);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void release() {
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public HttpRequest releaseAndCopy() {
|
|
|
- return this;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public Exception getInboundException() {
|
|
|
- return null;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private static class TestResponse implements HttpResponse {
|
|
|
-
|
|
|
- private final RestStatus status;
|
|
|
- private final BytesReference content;
|
|
|
- private final Map<String, List<String>> headers = new HashMap<>();
|
|
|
-
|
|
|
- TestResponse(RestStatus status, BytesReference content) {
|
|
|
- this.status = status;
|
|
|
- this.content = content;
|
|
|
- }
|
|
|
-
|
|
|
- public String contentType() {
|
|
|
- return "text";
|
|
|
- }
|
|
|
-
|
|
|
- public BytesReference content() {
|
|
|
- return content;
|
|
|
- }
|
|
|
-
|
|
|
- public RestStatus status() {
|
|
|
- return status;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void addHeader(String name, String value) {
|
|
|
- if (headers.containsKey(name) == false) {
|
|
|
- ArrayList<String> values = new ArrayList<>();
|
|
|
- values.add(value);
|
|
|
- headers.put(name, values);
|
|
|
- } else {
|
|
|
- headers.get(name).add(value);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public boolean containsHeader(String name) {
|
|
|
- return headers.containsKey(name);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
private static class TestRestResponse extends RestResponse {
|
|
|
|
|
|
private final RestStatus status;
|