diff --git a/app/core/src/main/java/stirling/software/SPDF/controller/web/ReactRoutingController.java b/app/core/src/main/java/stirling/software/SPDF/controller/web/ReactRoutingController.java index db0d95a36..424621b8a 100644 --- a/app/core/src/main/java/stirling/software/SPDF/controller/web/ReactRoutingController.java +++ b/app/core/src/main/java/stirling/software/SPDF/controller/web/ReactRoutingController.java @@ -4,6 +4,8 @@ import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; +import jakarta.annotation.PostConstruct; + import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.ClassPathResource; import org.springframework.http.MediaType; @@ -19,9 +21,25 @@ public class ReactRoutingController { @Value("${server.servlet.context-path:/}") private String contextPath; - @GetMapping(value = {"/", "/index.html"}, produces = MediaType.TEXT_HTML_VALUE) - public ResponseEntity serveIndexHtml(HttpServletRequest request) - throws IOException { + private String cachedIndexHtml; + private boolean indexHtmlExists = false; + + @PostConstruct + public void init() { + // Only cache if index.html exists (production builds) + ClassPathResource resource = new ClassPathResource("static/index.html"); + if (resource.exists()) { + try { + this.cachedIndexHtml = processIndexHtml(); + this.indexHtmlExists = true; + } catch (IOException e) { + // Failed to cache, will process on each request + this.indexHtmlExists = false; + } + } + } + + private String processIndexHtml() throws IOException { ClassPathResource resource = new ClassPathResource("static/index.html"); try (InputStream inputStream = resource.getInputStream()) { @@ -41,10 +59,20 @@ public class ReactRoutingController { ""; html = html.replace("", contextPathScript + ""); - return ResponseEntity.ok().contentType(MediaType.TEXT_HTML).body(html); + return html; } } + @GetMapping(value = {"/", "/index.html"}, produces = MediaType.TEXT_HTML_VALUE) + public ResponseEntity serveIndexHtml(HttpServletRequest request) + throws IOException { + if (indexHtmlExists && cachedIndexHtml != null) { + return ResponseEntity.ok().contentType(MediaType.TEXT_HTML).body(cachedIndexHtml); + } + // Fallback: process on each request (dev mode or cache failed) + return ResponseEntity.ok().contentType(MediaType.TEXT_HTML).body(processIndexHtml()); + } + @GetMapping( "/{path:^(?!api|static|robots\\.txt|favicon\\.ico|manifest.*\\.json|pipeline|pdfjs|pdfjs-legacy|fonts|images|files|css|js|assets|locales|modern-logo|classic-logo|Login|og_images|samples)[^\\.]*$}") public ResponseEntity forwardRootPaths(HttpServletRequest request) diff --git a/frontend/src/core/utils/automationExecutor.ts b/frontend/src/core/utils/automationExecutor.ts index 760a86d7b..6f1234f81 100644 --- a/frontend/src/core/utils/automationExecutor.ts +++ b/frontend/src/core/utils/automationExecutor.ts @@ -1,4 +1,4 @@ -import axios from 'axios'; +import apiClient from '@app/services/apiClient'; import { ToolRegistry } from '@app/data/toolsTaxonomy'; import { ToolId } from '@app/types/toolId'; import { AUTOMATION_CONSTANTS } from '@app/constants/automation'; @@ -58,7 +58,7 @@ const executeApiRequest = async ( filePrefix: string, preserveBackendFilename?: boolean ): Promise => { - const response = await axios.post(endpoint, formData, { + const response = await apiClient.post(endpoint, formData, { responseType: 'blob', timeout: AUTOMATION_CONSTANTS.OPERATION_TIMEOUT });