Quellcode durchsuchen

Adding back a validation of incorrect response header (#65255)

SQL used to validate this and previous refactoring accidentally removed
this.
This commit brings it back.
relates #51816
Przemyslaw Gomulka vor 4 Jahren
Ursprung
Commit
4f4c3d3371

+ 18 - 0
x-pack/plugin/sql/qa/server/single-node/src/test/java/org/elasticsearch/xpack/sql/qa/single_node/RestSqlIT.java

@@ -5,6 +5,10 @@
  */
 package org.elasticsearch.xpack.sql.qa.single_node;
 
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.elasticsearch.client.Request;
+import org.elasticsearch.client.RequestOptions;
 import org.elasticsearch.xpack.sql.qa.rest.RestSqlTestCase;
 
 import java.io.IOException;
@@ -69,4 +73,18 @@ public class RestSqlIT extends RestSqlTestCase {
         );
 
     }
+
+    public void testIncorrectAcceptHeader() throws IOException {
+        index("{\"foo\":1}");
+        Request request = new Request("POST", SQL_QUERY_REST_ENDPOINT);
+        RequestOptions.Builder options = request.getOptions().toBuilder();
+        options.addHeader("Accept", "application/fff");
+        request.setOptions(options);
+        StringEntity stringEntity = new StringEntity(query("select * from test").toString(), ContentType.APPLICATION_JSON);
+        request.setEntity(stringEntity);
+        expectBadRequest(
+            () -> toMap(client().performRequest(request), "plain"),
+            containsString("Invalid response content type: Accept=[application/fff]")
+        );
+    }
 }

+ 8 - 3
x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plugin/RestSqlQueryAction.java

@@ -27,6 +27,7 @@ import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.util.Collections;
 import java.util.List;
+import java.util.Locale;
 import java.util.Set;
 
 import static org.elasticsearch.rest.RestRequest.Method.GET;
@@ -57,8 +58,12 @@ public class RestSqlQueryAction extends BaseRestHandler {
             sqlRequest = SqlQueryRequest.fromXContent(parser);
         }
 
-        responseMediaType = sqlMediaTypeParser.getMediaType(request, sqlRequest);
-
+        responseMediaType = sqlMediaTypeParser.getResponseMediaType(request, sqlRequest);
+        if (responseMediaType == null) {
+            String msg = String.format(Locale.ROOT, "Invalid response content type: Accept=[%s], Content-Type=[%s], format=[%s]",
+                request.header("Accept"), request.header("Content-Type"), request.param("format"));
+            throw new IllegalArgumentException(msg);
+        }
         long startNanos = System.nanoTime();
         return channel -> client.execute(SqlQueryAction.INSTANCE, sqlRequest, new RestResponseListener<SqlQueryResponse>(channel) {
             @Override
@@ -66,7 +71,7 @@ public class RestSqlQueryAction extends BaseRestHandler {
                 RestResponse restResponse;
 
                 // XContent branch
-                if (responseMediaType != null && responseMediaType instanceof XContentType) {
+                if (responseMediaType instanceof XContentType) {
                     XContentType type = (XContentType) responseMediaType;
                     XContentBuilder builder = channel.newBuilder(request.getXContentType(), type, true);
                     response.toXContent(builder, request);

+ 1 - 1
x-pack/plugin/sql/src/main/java/org/elasticsearch/xpack/sql/plugin/SqlMediaTypeParser.java

@@ -33,7 +33,7 @@ public class SqlMediaTypeParser {
      * isn't but there is a {@code Accept} header then we use that. If there
      * isn't then we use the {@code Content-Type} header which is required.
      */
-    public MediaType getMediaType(RestRequest request, SqlQueryRequest sqlRequest) {
+    public MediaType getResponseMediaType(RestRequest request, SqlQueryRequest sqlRequest) {
         if (Mode.isDedicatedClient(sqlRequest.requestInfo().mode())
             && (sqlRequest.binaryCommunication() == null || sqlRequest.binaryCommunication())) {
             // enforce CBOR response for drivers and CLI (unless instructed differently through the config param)

+ 15 - 14
x-pack/plugin/sql/src/test/java/org/elasticsearch/xpack/sql/plugin/SqlMediaTypeParserTests.java

@@ -30,48 +30,49 @@ public class SqlMediaTypeParserTests extends ESTestCase {
     SqlMediaTypeParser parser = new SqlMediaTypeParser();
 
     public void testPlainTextDetection() {
-        MediaType text = parser.getMediaType(reqWithAccept("text/plain"), createTestInstance(false, Mode.PLAIN, false));
+        MediaType text = parser.getResponseMediaType(reqWithAccept("text/plain"), createTestInstance(false, Mode.PLAIN, false));
         assertThat(text, is(PLAIN_TEXT));
     }
 
     public void testCsvDetection() {
-        MediaType text = parser.getMediaType(reqWithAccept("text/csv"), createTestInstance(false, Mode.PLAIN, false));
+        MediaType text = parser.getResponseMediaType(reqWithAccept("text/csv"), createTestInstance(false, Mode.PLAIN, false));
         assertThat(text, is(CSV));
 
-        text = parser.getMediaType(reqWithAccept("text/csv; delimiter=x"), createTestInstance(false, Mode.PLAIN, false));
+        text = parser.getResponseMediaType(reqWithAccept("text/csv; delimiter=x"), createTestInstance(false, Mode.PLAIN, false));
         assertThat(text, is(CSV));
     }
 
     public void testTsvDetection() {
-        MediaType text = parser.getMediaType(reqWithAccept("text/tab-separated-values"), createTestInstance(false, Mode.PLAIN, false));
+        MediaType text = parser.getResponseMediaType(reqWithAccept("text/tab-separated-values"),
+            createTestInstance(false, Mode.PLAIN, false));
         assertThat(text, is(TSV));
     }
 
     public void testMediaTypeDetectionWithParameters() {
-        assertThat(parser.getMediaType(reqWithAccept("text/plain; charset=utf-8"),
+        assertThat(parser.getResponseMediaType(reqWithAccept("text/plain; charset=utf-8"),
             createTestInstance(false, Mode.PLAIN, false)), is(PLAIN_TEXT));
-        assertThat(parser.getMediaType(reqWithAccept("text/plain; header=present"),
+        assertThat(parser.getResponseMediaType(reqWithAccept("text/plain; header=present"),
             createTestInstance(false, Mode.PLAIN, false)), is(PLAIN_TEXT));
-        assertThat(parser.getMediaType(reqWithAccept("text/plain; charset=utf-8; header=present"),
+        assertThat(parser.getResponseMediaType(reqWithAccept("text/plain; charset=utf-8; header=present"),
             createTestInstance(false, Mode.PLAIN, false)), is(PLAIN_TEXT));
 
-        assertThat(parser.getMediaType(reqWithAccept("text/csv; charset=utf-8"),
+        assertThat(parser.getResponseMediaType(reqWithAccept("text/csv; charset=utf-8"),
             createTestInstance(false, Mode.PLAIN, false)), is(CSV));
-        assertThat(parser.getMediaType(reqWithAccept("text/csv; header=present"),
+        assertThat(parser.getResponseMediaType(reqWithAccept("text/csv; header=present"),
             createTestInstance(false, Mode.PLAIN, false)), is(CSV));
-        assertThat(parser.getMediaType(reqWithAccept("text/csv; charset=utf-8; header=present"),
+        assertThat(parser.getResponseMediaType(reqWithAccept("text/csv; charset=utf-8; header=present"),
             createTestInstance(false, Mode.PLAIN, false)), is(CSV));
 
-        assertThat(parser.getMediaType(reqWithAccept("text/tab-separated-values; charset=utf-8"),
+        assertThat(parser.getResponseMediaType(reqWithAccept("text/tab-separated-values; charset=utf-8"),
             createTestInstance(false, Mode.PLAIN, false)), is(TSV));
-        assertThat(parser.getMediaType(reqWithAccept("text/tab-separated-values; header=present"),
+        assertThat(parser.getResponseMediaType(reqWithAccept("text/tab-separated-values; header=present"),
             createTestInstance(false, Mode.PLAIN, false)), is(TSV));
-        assertThat(parser.getMediaType(reqWithAccept("text/tab-separated-values; charset=utf-8; header=present"),
+        assertThat(parser.getResponseMediaType(reqWithAccept("text/tab-separated-values; charset=utf-8; header=present"),
             createTestInstance(false, Mode.PLAIN, false)), is(TSV));
     }
 
     public void testInvalidFormat() {
-        MediaType mediaType = parser.getMediaType(reqWithAccept("text/garbage"), createTestInstance(false, Mode.PLAIN, false));
+        MediaType mediaType = parser.getResponseMediaType(reqWithAccept("text/garbage"), createTestInstance(false, Mode.PLAIN, false));
         assertThat(mediaType, is(nullValue()));
     }