diff --git a/server/src/main/java/org/elasticsearch/rest/RestController.java b/server/src/main/java/org/elasticsearch/rest/RestController.java index b9875795006d7..299009434ec5a 100644 --- a/server/src/main/java/org/elasticsearch/rest/RestController.java +++ b/server/src/main/java/org/elasticsearch/rest/RestController.java @@ -57,6 +57,8 @@ public class RestController implements HttpServerTransport.Dispatcher { private static final Logger logger = LogManager.getLogger(RestController.class); private static final DeprecationLogger deprecationLogger = DeprecationLogger.getLogger(RestController.class); + static final String ELASTIC_PRODUCT_HTTP_HEADER = "X-elastic-product"; + static final String ELASTIC_PRODUCT_HTTP_HEADER_VALUE = "Elasticsearch"; private static final String ELASTIC_PRODUCT_ORIGIN_HTTP_HEADER = "X-elastic-product-origin"; private static final BytesReference FAVICON_RESPONSE; @@ -210,6 +212,7 @@ public void registerHandler(final RestHandler handler) { @Override public void dispatchRequest(RestRequest request, RestChannel channel, ThreadContext threadContext) { + threadContext.addResponseHeader(ELASTIC_PRODUCT_HTTP_HEADER, ELASTIC_PRODUCT_HTTP_HEADER_VALUE); try { tryAllHandlers(request, channel, threadContext); } catch (Exception e) { @@ -225,6 +228,7 @@ public void dispatchRequest(RestRequest request, RestChannel channel, ThreadCont @Override public void dispatchBadRequest(final RestChannel channel, final ThreadContext threadContext, final Throwable cause) { + threadContext.addResponseHeader(ELASTIC_PRODUCT_HTTP_HEADER, ELASTIC_PRODUCT_HTTP_HEADER_VALUE); try { final Exception e; if (cause == null) { diff --git a/server/src/test/java/org/elasticsearch/rest/RestControllerTests.java b/server/src/test/java/org/elasticsearch/rest/RestControllerTests.java index f989a9c69ef0d..083a08dad1da7 100644 --- a/server/src/test/java/org/elasticsearch/rest/RestControllerTests.java +++ b/server/src/test/java/org/elasticsearch/rest/RestControllerTests.java @@ -40,6 +40,7 @@ import org.junit.Before; import java.io.IOException; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; @@ -142,6 +143,10 @@ public MethodHandlers next() { assertEquals("true", threadContext.getHeader("header.1")); assertEquals("true", threadContext.getHeader("header.2")); assertNull(threadContext.getHeader("header.3")); + List expectedProductResponseHeader = new ArrayList<>(); + expectedProductResponseHeader.add(RestController.ELASTIC_PRODUCT_HTTP_HEADER_VALUE); + assertEquals(expectedProductResponseHeader, threadContext.getResponseHeaders() + .getOrDefault(RestController.ELASTIC_PRODUCT_HTTP_HEADER, null)); } public void testRequestWithDisallowedMultiValuedHeader() { diff --git a/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/rest/SecurityRestFilter.java b/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/rest/SecurityRestFilter.java index 643e7562ea8a1..544f0cad7970d 100644 --- a/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/rest/SecurityRestFilter.java +++ b/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/rest/SecurityRestFilter.java @@ -111,7 +111,10 @@ private void handleException(String actionType, RestRequest request, RestChannel @Override public Map> filterHeaders(Map> headers) { if (headers.containsKey("Warning")) { - return Maps.copyMapWithRemovedEntry(headers, "Warning"); + headers = Maps.copyMapWithRemovedEntry(headers, "Warning"); + } + if (headers.containsKey("X-elastic-product")) { + headers = Maps.copyMapWithRemovedEntry(headers, "X-elastic-product"); } return headers; }