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);

Reply via email to