Skip to content

Commit

Permalink
Support content type application/x-ndjson in DeprecationRestHandler (
Browse files Browse the repository at this point in the history
…#36025)

org.elasticsearch.rest.RestController#hasContentType checks to see if the
RestHandler supports the `application/x-ndjson` Content-Type. DeprecationRestHandler
is a wrapper around the real RestHandler, and prior to this change
would always return `false` due to the interface's default supportsContentStream().
This prevents API's that use multi-line JSON from properly being deprecated
resulting in an HTTP 406 error.

This change ensures that the DeprecationRestHandler honors the
supportsContentStream() of the wrapped RestHandler.

Relates to #35958
  • Loading branch information
jakelandis authored Nov 29, 2018
1 parent 95d9cef commit f8636e5
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,11 @@ public void handleRequest(RestRequest request, RestChannel channel, NodeClient c
handler.handleRequest(request, channel, client);
}

@Override
public boolean supportsContentStream() {
return handler.supportsContentStream();
}

/**
* This does a very basic pass at validating that a header's value contains only expected characters according to RFC-5987, and those
* that it references.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,22 +24,30 @@
import org.elasticsearch.common.logging.DeprecationLogger;
import org.elasticsearch.test.ESTestCase;

import org.junit.Before;
import org.mockito.InOrder;

import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

/**
* Tests {@link DeprecationRestHandler}.
*/
public class DeprecationRestHandlerTests extends ESTestCase {

private final RestHandler handler = mock(RestHandler.class);
private RestHandler handler;
/**
* Note: Headers should only use US ASCII (and this inevitably becomes one!).
*/
private final String deprecationMessage = randomAlphaOfLengthBetween(1, 30);
private final DeprecationLogger deprecationLogger = mock(DeprecationLogger.class);
private DeprecationLogger deprecationLogger;

@Before
public void setup() {
handler = mock(RestHandler.class);
deprecationLogger = mock(DeprecationLogger.class);
}

public void testNullHandler() {
expectThrows(NullPointerException.class, () -> new DeprecationRestHandler(null, deprecationMessage, deprecationLogger));
Expand Down Expand Up @@ -114,6 +122,16 @@ public void testInvalidHeaderValueEmpty() {
expectThrows(IllegalArgumentException.class, () -> DeprecationRestHandler.requireValidHeader(blank));
}

public void testSupportsContentStreamTrue() {
when(handler.supportsContentStream()).thenReturn(true);
assertTrue(new DeprecationRestHandler(handler, deprecationMessage, deprecationLogger).supportsContentStream());
}

public void testSupportsContentStreamFalse() {
when(handler.supportsContentStream()).thenReturn(false);
assertFalse(new DeprecationRestHandler(handler, deprecationMessage, deprecationLogger).supportsContentStream());
}

/**
* {@code ASCIIHeaderGenerator} only uses characters expected to be valid in headers (simplified US-ASCII).
*/
Expand Down

0 comments on commit f8636e5

Please sign in to comment.