This is an automated email from the ASF dual-hosted git repository.
dengliming pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shenyu.git
The following commit(s) were added to refs/heads/master by this push:
new 3a411e017a fix(admin): guard against null servers and parameters in
Swagger MCP import (#6452)
3a411e017a is described below
commit 3a411e017acfc47636e2bbfeb2958108d1f15a05
Author: wy471x <[email protected]>
AuthorDate: Thu Jul 30 10:42:15 2026 +0800
fix(admin): guard against null servers and parameters in Swagger MCP import
(#6452)
Co-authored-by: aias00 <[email protected]>
Co-authored-by: xiaoyu <[email protected]>
---
.../service/impl/SwaggerImportServiceImpl.java | 14 ++++--
.../service/impl/SwaggerImportServiceImplTest.java | 51 ++++++++++++++++++++++
2 files changed, 61 insertions(+), 4 deletions(-)
diff --git
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/SwaggerImportServiceImpl.java
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/SwaggerImportServiceImpl.java
index 95b79582e3..e2965b2c9c 100644
---
a/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/SwaggerImportServiceImpl.java
+++
b/shenyu-admin/src/main/java/org/apache/shenyu/admin/service/impl/SwaggerImportServiceImpl.java
@@ -216,6 +216,10 @@ public class SwaggerImportServiceImpl implements
SwaggerImportService {
private MetaDataRegisterDTO buildMetaDataRegisterDTO(final OpenAPI
openapi, final String selectorName,
final ShenyuMcpTool
shenyuMcpTool, final String contentPath,
final String
namespaceId) {
+ if (Objects.isNull(openapi.getServers()) ||
openapi.getServers().isEmpty()) {
+ throw new IllegalArgumentException("OpenAPI document is missing
the top-level 'servers' field, which is required for MCP import. "
+ + "Please add a servers section, e.g.: servers: [{ url:
'http://localhost:8080' }]");
+ }
String urlString = openapi.getServers().get(0).getUrl();
URL url;
try {
@@ -227,10 +231,12 @@ public class SwaggerImportServiceImpl implements
SwaggerImportService {
String host = url.getHost();
int port = url.getPort();
Operation operation = shenyuMcpTool.getOperation();
- String parameterTypes = operation.getParameters()
- .stream()
- .map(Parameter::getIn)
- .collect(Collectors.joining(","));
+ String parameterTypes = Objects.isNull(operation.getParameters())
+ ? ""
+ : operation.getParameters()
+ .stream()
+ .map(Parameter::getIn)
+ .collect(Collectors.joining(","));
return MetaDataRegisterDTO.builder()
.appName(openapi.getInfo().getTitle())
diff --git
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/impl/SwaggerImportServiceImplTest.java
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/impl/SwaggerImportServiceImplTest.java
index 6c02347175..86a43ac42e 100644
---
a/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/impl/SwaggerImportServiceImplTest.java
+++
b/shenyu-admin/src/test/java/org/apache/shenyu/admin/service/impl/SwaggerImportServiceImplTest.java
@@ -17,6 +17,10 @@
package org.apache.shenyu.admin.service.impl;
+import io.swagger.v3.oas.models.OpenAPI;
+import io.swagger.v3.oas.models.Operation;
+import io.swagger.v3.oas.models.info.Info;
+import io.swagger.v3.oas.models.servers.Server;
import okhttp3.MediaType;
import okhttp3.Protocol;
import okhttp3.Request;
@@ -29,6 +33,8 @@ import org.apache.shenyu.admin.model.bean.UpstreamInstance;
import org.apache.shenyu.admin.model.dto.SwaggerImportRequest;
import org.apache.shenyu.admin.service.manager.DocManager;
import org.apache.shenyu.admin.utils.HttpUtils;
+import org.apache.shenyu.client.mcp.common.dto.ShenyuMcpTool;
+import org.apache.shenyu.register.common.dto.MetaDataRegisterDTO;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.test.util.ReflectionTestUtils;
@@ -38,10 +44,12 @@ import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.Collection;
import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
/**
@@ -126,6 +134,49 @@ public class SwaggerImportServiceImplTest {
assertEquals(body, result);
}
+ @Test
+ public void buildMetaDataRegisterDTOShouldThrowWhenServersIsNull() {
+ SwaggerImportServiceImpl service = new
SwaggerImportServiceImpl(docManager, httpUtils);
+ OpenAPI openapi = new OpenAPI()
+ .info(new Info().title("test"));
+
+ assertThrows(IllegalArgumentException.class, () ->
+ ReflectionTestUtils.invokeMethod(service,
"buildMetaDataRegisterDTO",
+ openapi, "test", new ShenyuMcpTool(), "/ping", "ns1"));
+ }
+
+ @Test
+ public void buildMetaDataRegisterDTOShouldThrowWhenServersIsEmpty() {
+ SwaggerImportServiceImpl service = new
SwaggerImportServiceImpl(docManager, httpUtils);
+ OpenAPI openapi = new OpenAPI()
+ .info(new Info().title("test"))
+ .servers(Collections.emptyList());
+
+ assertThrows(IllegalArgumentException.class, () ->
+ ReflectionTestUtils.invokeMethod(service,
"buildMetaDataRegisterDTO",
+ openapi, "test", new ShenyuMcpTool(), "/ping", "ns1"));
+ }
+
+ @Test
+ public void buildMetaDataRegisterDTOShouldHandleNullParameters() {
+ SwaggerImportServiceImpl service = new
SwaggerImportServiceImpl(docManager, httpUtils);
+ OpenAPI openapi = new OpenAPI()
+ .info(new Info().title("test"))
+ .servers(List.of(new Server().url("http://localhost:8080")));
+ Operation operation = new Operation()
+ .operationId("ping")
+ .parameters(null);
+ ShenyuMcpTool tool = new ShenyuMcpTool();
+ tool.setOperation(operation);
+ tool.setToolName("ping");
+
+ MetaDataRegisterDTO result = ReflectionTestUtils.invokeMethod(service,
"buildMetaDataRegisterDTO",
+ openapi, "test", tool, "/ping", "ns1");
+
+ assertNotNull(result);
+ assertEquals("", result.getParameterTypes());
+ }
+
private SwaggerImportRequest request() {
SwaggerImportRequest request = new SwaggerImportRequest();
request.setSwaggerUrl(SWAGGER_URL);