|
@@ -52,6 +52,7 @@ public class Netty4HttpHeaderValidatorTests extends ESTestCase {
|
|
|
private final AtomicReference<ActionListener<Void>> listener = new AtomicReference<>();
|
|
|
private EmbeddedChannel channel;
|
|
|
private Netty4HttpHeaderValidator netty4HttpHeaderValidator;
|
|
|
+ private final AtomicReference<RuntimeException> validationException = new AtomicReference<>();
|
|
|
|
|
|
@Override
|
|
|
public void setUp() throws Exception {
|
|
@@ -63,8 +64,13 @@ public class Netty4HttpHeaderValidatorTests extends ESTestCase {
|
|
|
channel = new EmbeddedChannel();
|
|
|
header.set(null);
|
|
|
listener.set(null);
|
|
|
+ validationException.set(null);
|
|
|
HttpValidator validator = (httpRequest, channel, validationCompleteListener) -> {
|
|
|
header.set(httpRequest);
|
|
|
+ final var exception = validationException.get();
|
|
|
+ if (exception != null) {
|
|
|
+ throw exception;
|
|
|
+ }
|
|
|
listener.set(validationCompleteListener);
|
|
|
};
|
|
|
netty4HttpHeaderValidator = new Netty4HttpHeaderValidator(validator, new ThreadContext(Settings.EMPTY));
|
|
@@ -253,6 +259,7 @@ public class Netty4HttpHeaderValidatorTests extends ESTestCase {
|
|
|
|
|
|
final DefaultHttpRequest request = new DefaultHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "/uri");
|
|
|
final DefaultHttpContent content = new DefaultHttpContent(Unpooled.buffer(4));
|
|
|
+
|
|
|
channel.writeInbound(request);
|
|
|
channel.writeInbound(content);
|
|
|
|
|
@@ -285,6 +292,43 @@ public class Netty4HttpHeaderValidatorTests extends ESTestCase {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ public void testValidationExceptionForwardsAsDecoderErrorMessage() {
|
|
|
+ final var exception = new ElasticsearchException("Failure");
|
|
|
+ assertTrue(channel.config().isAutoRead());
|
|
|
+ assertThat(netty4HttpHeaderValidator.getState(), equalTo(WAITING_TO_START));
|
|
|
+
|
|
|
+ final DefaultHttpRequest request = new DefaultHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, "/uri");
|
|
|
+
|
|
|
+ validationException.set(exception);
|
|
|
+ channel.writeInbound(request);
|
|
|
+
|
|
|
+ assertThat(header.get(), sameInstance(request));
|
|
|
+ assertThat(listener.get(), nullValue());
|
|
|
+
|
|
|
+ channel.runPendingTasks();
|
|
|
+ assertTrue(channel.config().isAutoRead());
|
|
|
+ DefaultHttpRequest failed = channel.readInbound();
|
|
|
+ assertThat(failed, sameInstance(request));
|
|
|
+ assertThat(failed.headers().get(HttpHeaderNames.CONNECTION), nullValue());
|
|
|
+ assertTrue(failed.decoderResult().isFailure());
|
|
|
+ Exception cause = (Exception) failed.decoderResult().cause();
|
|
|
+ assertThat(cause, equalTo(exception));
|
|
|
+ assertThat(netty4HttpHeaderValidator.getState(), equalTo(DROPPING_DATA_UNTIL_NEXT_REQUEST));
|
|
|
+
|
|
|
+ final DefaultHttpContent content = new DefaultHttpContent(Unpooled.buffer(4));
|
|
|
+ channel.writeInbound(content);
|
|
|
+
|
|
|
+ assertThat(channel.readInbound(), nullValue());
|
|
|
+ assertThat(content.refCnt(), equalTo(0));
|
|
|
+
|
|
|
+ DefaultLastHttpContent lastContent = new DefaultLastHttpContent(Unpooled.buffer(4));
|
|
|
+ channel.writeInbound(lastContent);
|
|
|
+ assertTrue(channel.config().isAutoRead());
|
|
|
+ assertThat(netty4HttpHeaderValidator.getState(), equalTo(WAITING_TO_START));
|
|
|
+ assertThat(channel.readInbound(), nullValue());
|
|
|
+ assertThat(lastContent.refCnt(), equalTo(0));
|
|
|
+ }
|
|
|
+
|
|
|
public void testValidationHandlesMultipleQueuedUpMessages() {
|
|
|
assertTrue(channel.config().isAutoRead());
|
|
|
assertThat(netty4HttpHeaderValidator.getState(), equalTo(WAITING_TO_START));
|