diff --git a/plugin/src/main/java/org/opensearch/ml/rest/RestMLUpdateConnectorAction.java b/plugin/src/main/java/org/opensearch/ml/rest/RestMLUpdateConnectorAction.java index 2957740354..0c31695d1d 100644 --- a/plugin/src/main/java/org/opensearch/ml/rest/RestMLUpdateConnectorAction.java +++ b/plugin/src/main/java/org/opensearch/ml/rest/RestMLUpdateConnectorAction.java @@ -16,6 +16,7 @@ import java.util.List; import java.util.Locale; +import org.opensearch.OpenSearchParseException; import org.opensearch.client.node.NodeClient; import org.opensearch.core.xcontent.XContentParser; import org.opensearch.ml.common.transport.connector.MLUpdateConnectorAction; @@ -63,14 +64,17 @@ private MLUpdateConnectorRequest getRequest(RestRequest request) throws IOExcept throw new IllegalStateException(UPDATE_CONNECTOR_DISABLED_ERR_MSG); } if (!request.hasContent()) { - throw new IOException("Failed to update connector: Request body is empty"); + throw new OpenSearchParseException("Failed to update connector: Request body is empty"); } String connectorId = getParameterId(request, PARAMETER_CONNECTOR_ID); - XContentParser parser = request.contentParser(); - ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.nextToken(), parser); - - return MLUpdateConnectorRequest.parse(parser, connectorId); + try { + XContentParser parser = request.contentParser(); + ensureExpectedToken(XContentParser.Token.START_OBJECT, parser.nextToken(), parser); + return MLUpdateConnectorRequest.parse(parser, connectorId); + } catch (IllegalStateException illegalStateException) { + throw new OpenSearchParseException(illegalStateException.getMessage()); + } } } diff --git a/plugin/src/test/java/org/opensearch/ml/rest/RestMLUpdateConnectorActionTests.java b/plugin/src/test/java/org/opensearch/ml/rest/RestMLUpdateConnectorActionTests.java index 3bc5a5e940..d880baaa2e 100644 --- a/plugin/src/test/java/org/opensearch/ml/rest/RestMLUpdateConnectorActionTests.java +++ b/plugin/src/test/java/org/opensearch/ml/rest/RestMLUpdateConnectorActionTests.java @@ -14,7 +14,6 @@ import static org.mockito.Mockito.when; import static org.opensearch.ml.utils.MLExceptionUtils.REMOTE_INFERENCE_DISABLED_ERR_MSG; -import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -25,6 +24,7 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.opensearch.OpenSearchParseException; import org.opensearch.action.update.UpdateResponse; import org.opensearch.client.node.NodeClient; import org.opensearch.common.settings.Settings; @@ -114,8 +114,15 @@ public void testUpdateConnectorRequest() throws Exception { assertEquals("2", updateConnectorRequest.getUpdateContent().getVersion()); } + public void testUpdateConnectorRequestWithParsingException() throws Exception { + exceptionRule.expect(OpenSearchParseException.class); + exceptionRule.expectMessage("Can't get text on a VALUE_NULL"); + RestRequest request = getRestRequestWithNullValue(); + restMLUpdateConnectorAction.handleRequest(request, channel, client); + } + public void testUpdateConnectorRequestWithEmptyContent() throws Exception { - exceptionRule.expect(IOException.class); + exceptionRule.expect(OpenSearchParseException.class); exceptionRule.expectMessage("Failed to update connector: Request body is empty"); RestRequest request = getRestRequestWithEmptyContent(); restMLUpdateConnectorAction.handleRequest(request, channel, client); @@ -152,6 +159,20 @@ private RestRequest getRestRequest() { return request; } + private RestRequest getRestRequestWithNullValue() { + RestRequest.Method method = RestRequest.Method.POST; + String requestContent = "{\"version\":\"2\",\"description\":null}"; + Map params = new HashMap<>(); + params.put("connector_id", "test_connectorId"); + RestRequest request = new FakeRestRequest.Builder(NamedXContentRegistry.EMPTY) + .withMethod(method) + .withPath("/_plugins/_ml/connectors/_update/{connector_id}") + .withParams(params) + .withContent(new BytesArray(requestContent), XContentType.JSON) + .build(); + return request; + } + private RestRequest getRestRequestWithEmptyContent() { RestRequest.Method method = RestRequest.Method.POST; Map params = new HashMap<>();