2929import java .io .PrintWriter ;
3030import java .io .InputStream ;
3131import java .io .ByteArrayOutputStream ;
32+ import java .net .URI ;
3233import java .nio .charset .StandardCharsets ;
3334import java .util .Map ;
3435
@@ -109,7 +110,7 @@ public void handleSwaggerUIRequest(HttpServletRequest request, HttpServletRespon
109110 addSecurityHeaders (response );
110111
111112 // Build OpenAPI specification URL from configuration
112- String openApiUrl = buildOpenApiUrl (request );
113+ URI openApiUrl = buildOpenApiUrl (request );
113114
114115 // Generate customized Swagger UI HTML
115116 String swaggerHtml = generateSwaggerUIHtml (openApiUrl , request );
@@ -227,26 +228,23 @@ public void handleMcpCatalogRequest(HttpServletRequest request, HttpServletRespo
227228 /**
228229 * Build the URL for the OpenAPI specification endpoint using configuration.
229230 */
230- private String buildOpenApiUrl (HttpServletRequest request ) {
231+ private URI buildOpenApiUrl (HttpServletRequest request ) {
231232 // Check if URL is configured in SwaggerUiConfig
232233 if (swaggerUiConfig != null && swaggerUiConfig .getUrl () != null ) {
233234 String configuredUrl = swaggerUiConfig .getUrl ();
234235 if (configuredUrl .startsWith ("http" )) {
235- return configuredUrl ; // Absolute URL
236+ return URI . create ( configuredUrl ) ; // Absolute URL
236237 } else if (configuredUrl .startsWith ("/" )) {
237238 // Relative URL - build full URL
238- return buildBaseUrl (request ) + configuredUrl ;
239+ return URI . create ( buildBaseUrl (request ) + configuredUrl ) ;
239240 } else {
240241 // Relative path - append to current path
241- return buildBaseUrl (request ) + "/" + configuredUrl ;
242+ return URI . create ( buildBaseUrl (request ) + "/" + configuredUrl ) ;
242243 }
243244 }
244245
245246 // Build default URL
246- StringBuilder url = new StringBuilder ();
247- url .append (buildBaseUrl (request ));
248- url .append ("/openapi.json" );
249- return url .toString ();
247+ return URI .create (buildBaseUrl (request ) + "/openapi.json" );
250248 }
251249
252250 /**
@@ -273,7 +271,7 @@ private String buildBaseUrl(HttpServletRequest request) {
273271 /**
274272 * Generate HTML for Swagger UI page with configuration-driven customization.
275273 */
276- private String generateSwaggerUIHtml (String openApiUrl , HttpServletRequest request ) {
274+ private String generateSwaggerUIHtml (URI openApiUrl , HttpServletRequest request ) {
277275 String swaggerUiVersion = configuration .getSwaggerUiVersion () != null ?
278276 configuration .getSwaggerUiVersion () : DEFAULT_SWAGGER_UI_VERSION ;
279277
@@ -384,15 +382,15 @@ private String generateHeader() {
384382 /**
385383 * Generate Swagger UI initialization script with configuration.
386384 */
387- private String generateSwaggerUIScript (String openApiUrl ) {
385+ private String generateSwaggerUIScript (URI openApiUrl ) {
388386 String configJs = swaggerUiConfig .toJavaScriptConfig ();
389387
390388 StringBuilder script = new StringBuilder ();
391389 script .append (" <script>\n " )
392390 .append (" window.onload = function() {\n " )
393391 .append (" const ui = SwaggerUIBundle(Object.assign(" )
394392 .append (configJs ).append (", {\n " )
395- .append (" url: '" ).append (openApiUrl ).append ("',\n " )
393+ .append (" url: '" ).append (openApiUrl . toString () ).append ("',\n " )
396394 .append (" dom_id: '#swagger-ui',\n " )
397395 .append (" presets: [\n " )
398396 .append (" SwaggerUIBundle.presets.apis,\n " )
0 commit comments