This is an automated email from the ASF dual-hosted git repository.

Aias00 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 91c39aad5c fix(ai): precompile regex patterns in request and response 
transformers (#7136)
91c39aad5c is described below

commit 91c39aad5ccff9adbd90f41a7628ac0a7d9edff7
Author: hengyuss <[email protected]>
AuthorDate: Mon Oct 12 22:49:09 2026 +0800

    fix(ai): precompile regex patterns in request and response transformers 
(#7136)
---
 .../ai/transformer/request/AiRequestTransformerPlugin.java | 14 ++++++++------
 .../transformer/response/AiResponseTransformerPlugin.java  |  5 ++++-
 2 files changed, 12 insertions(+), 7 deletions(-)

diff --git 
a/shenyu-plugin/shenyu-plugin-ai/shenyu-plugin-ai-request-transformer/src/main/java/org/apache/shenyu/plugin/ai/transformer/request/AiRequestTransformerPlugin.java
 
b/shenyu-plugin/shenyu-plugin-ai/shenyu-plugin-ai-request-transformer/src/main/java/org/apache/shenyu/plugin/ai/transformer/request/AiRequestTransformerPlugin.java
index 1c3dfaa6d8..198c2db3c9 100644
--- 
a/shenyu-plugin/shenyu-plugin-ai/shenyu-plugin-ai-request-transformer/src/main/java/org/apache/shenyu/plugin/ai/transformer/request/AiRequestTransformerPlugin.java
+++ 
b/shenyu-plugin/shenyu-plugin-ai/shenyu-plugin-ai-request-transformer/src/main/java/org/apache/shenyu/plugin/ai/transformer/request/AiRequestTransformerPlugin.java
@@ -58,6 +58,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -68,16 +69,18 @@ public class AiRequestTransformerPlugin extends 
AbstractShenyuPlugin {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(AiRequestTransformerPlugin.class);
 
+    private static final Pattern REQUEST_LINE_PATTERN = 
Pattern.compile("^(GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD)\\s.*\\sHTTP/1.1$");
+
     /**
      * Valid characters of a generated origin-form path component.
      */
-    private static final String PATH_PATTERN = "^/[a-zA-Z0-9/_\\-]*$";
+    private static final Pattern REQUEST_PATH_PATTERN = 
Pattern.compile("^/[a-zA-Z0-9/_\\-]*$");
 
     /**
      * Valid characters of a generated query component: RFC 3986 query syntax 
(percent-encoded
      * sequences must be well formed so that the target is always a legal URI 
reference).
      */
-    private static final String QUERY_PATTERN = 
"^(%[0-9a-fA-F]{2}|[a-zA-Z0-9\\-._~!$&'()*+,;=:@/?])*$";
+    private static final Pattern QUERY_PATTERN = 
Pattern.compile("^(%[0-9a-fA-F]{2}|[a-zA-Z0-9\\-._~!$&'()*+,;=:@/?])*$");
 
     private final List<HttpMessageReader<?>> messageReaders;
 
@@ -267,12 +270,12 @@ public class AiRequestTransformerPlugin extends 
AbstractShenyuPlugin {
             return Mono.just(exchange);
         }
 
-        if (!newPath.matches(PATH_PATTERN)) {
+        if (!REQUEST_PATH_PATTERN.matcher(newPath).matches()) {
             LOG.warn("Extracted path contains invalid characters: {}, Will 
continue to use the original path.", newPath);
             return Mono.just(exchange);
         }
 
-        if (Objects.nonNull(newQuery) && !newQuery.matches(QUERY_PATTERN)) {
+        if (Objects.nonNull(newQuery) && 
!QUERY_PATTERN.matcher(newQuery).matches()) {
             LOG.warn("Extracted query contains invalid characters: {}, Will 
continue to use the original path.", newQuery);
             return Mono.just(exchange);
         }
@@ -320,7 +323,7 @@ public class AiRequestTransformerPlugin extends 
AbstractShenyuPlugin {
             boolean headerSectionStarted = false;
             while (Objects.nonNull(line = reader.readLine())) {
                 if (!headerSectionStarted) {
-                    if (line.startsWith("HTTP/1.1") || 
line.matches("^(GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD)\\s.*\\sHTTP/1.1$")) {
+                    if (line.startsWith("HTTP/1.1") || 
REQUEST_LINE_PATTERN.matcher(line).matches()) {
                         headerSectionStarted = true;
                         continue;
                     }
@@ -374,4 +377,3 @@ public class AiRequestTransformerPlugin extends 
AbstractShenyuPlugin {
     }
 
 }
-
diff --git 
a/shenyu-plugin/shenyu-plugin-ai/shenyu-plugin-ai-response-transformer/src/main/java/org/apache/shenyu/plugin/ai/transformer/response/AiResponseTransformerPlugin.java
 
b/shenyu-plugin/shenyu-plugin-ai/shenyu-plugin-ai-response-transformer/src/main/java/org/apache/shenyu/plugin/ai/transformer/response/AiResponseTransformerPlugin.java
index 71ccc28e6a..48d79f853f 100644
--- 
a/shenyu-plugin/shenyu-plugin-ai/shenyu-plugin-ai-response-transformer/src/main/java/org/apache/shenyu/plugin/ai/transformer/response/AiResponseTransformerPlugin.java
+++ 
b/shenyu-plugin/shenyu-plugin-ai/shenyu-plugin-ai-response-transformer/src/main/java/org/apache/shenyu/plugin/ai/transformer/response/AiResponseTransformerPlugin.java
@@ -58,6 +58,7 @@ import java.nio.charset.StandardCharsets;
 import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import java.util.zip.GZIPInputStream;
@@ -74,6 +75,8 @@ public class AiResponseTransformerPlugin extends 
AbstractShenyuPlugin {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(AiResponseTransformerPlugin.class);
 
+    private static final Pattern REQUEST_LINE_PATTERN = 
Pattern.compile("^(GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD)\\s.*\\sHTTP/1.1$");
+
     private static final ObjectMapper MAPPER = new ObjectMapper();
 
     private final List<HttpMessageReader<?>> messageReaders;
@@ -263,7 +266,7 @@ public class AiResponseTransformerPlugin extends 
AbstractShenyuPlugin {
                 boolean headerSectionStarted = false;
                 while (Objects.nonNull(line = reader.readLine())) {
                     if (!headerSectionStarted) {
-                        if (line.startsWith("HTTP/1.1") || 
line.matches("^(GET|POST|PUT|DELETE|PATCH|OPTIONS|HEAD)\\s.*\\sHTTP/1.1$")) {
+                        if (line.startsWith("HTTP/1.1") || 
REQUEST_LINE_PATTERN.matcher(line).matches()) {
                             headerSectionStarted = true;
                             continue;
                         }

Reply via email to