diff --git a/shenyu-plugin/shenyu-plugin-rewrite/src/main/java/org/apache/shenyu/plugin/rewrite/RewritePlugin.java b/shenyu-plugin/shenyu-plugin-rewrite/src/main/java/org/apache/shenyu/plugin/rewrite/RewritePlugin.java index 486764f1e7bd..398443bd0eb7 100644 --- a/shenyu-plugin/shenyu-plugin-rewrite/src/main/java/org/apache/shenyu/plugin/rewrite/RewritePlugin.java +++ b/shenyu-plugin/shenyu-plugin-rewrite/src/main/java/org/apache/shenyu/plugin/rewrite/RewritePlugin.java @@ -76,7 +76,7 @@ protected Mono doExecute(final ServerWebExchange exchange, final ShenyuPlu && ThreadLocalRandom.current().nextInt(100) < percentage) { rewriteUri = rewriteHandle.getReplace().contains("{") && rewriteHandle.getRegex().contains("{") ? PathMatchUtils.replaceAll(rewriteHandle.getReplace(), rewriteHandle.getRegex().substring(rewriteHandle.getRegex().indexOf("{")), - rewriteUri.substring(rewriteHandle.getRegex().indexOf("{"))) + rewriteUri.substring(rewriteHandle.getRegex().indexOf("{"))) : rewriteUri.replaceAll(rewriteHandle.getRegex(), rewriteHandle.getReplace()); Map attributes = exchange.getAttributes(); if (Optional.ofNullable(rewriteHandle.getRewriteMetaData()).orElse(false)) { diff --git a/shenyu-plugin/shenyu-plugin-rewrite/src/test/java/org/apache/shenyu/plugin/rewrite/RewritePluginTest.java b/shenyu-plugin/shenyu-plugin-rewrite/src/test/java/org/apache/shenyu/plugin/rewrite/RewritePluginTest.java index 3d9f75a3dce0..5b5ec80bfc8b 100644 --- a/shenyu-plugin/shenyu-plugin-rewrite/src/test/java/org/apache/shenyu/plugin/rewrite/RewritePluginTest.java +++ b/shenyu-plugin/shenyu-plugin-rewrite/src/test/java/org/apache/shenyu/plugin/rewrite/RewritePluginTest.java @@ -88,6 +88,32 @@ public void shouldReturnNewURIForRewritePlugin() { assertEquals("/shenyu/rewrite", exchange.getAttributes().get(Constants.REWRITE_URI)); } + @Test + public void shouldRewritePathVariableWithCompleteValue() { + RuleData data = new RuleData(); + data.setHandle("{\"regex\":\"/shenyu/{id}\",\"replace\":\"/shenyu/{id}\"}"); + RewriteHandle rewriteHandle = GsonUtils.getGson().fromJson(data.getHandle(), RewriteHandle.class); + RewritePluginDataHandler.CACHED_HANDLE.get().cachedHandle(CacheKeyUtils.INST.getKey(data), rewriteHandle); + ServerWebExchange rewriteExchange = MockServerWebExchange.from(MockServerHttpRequest.get("/shenyu/123").build()); + rewriteExchange.getAttributes().put(Constants.CONTEXT, new ShenyuContext()); + when(chain.execute(rewriteExchange)).thenReturn(Mono.empty()); + SelectorData selectorData = mock(SelectorData.class); + StepVerifier.create(rewritePlugin.doExecute(rewriteExchange, chain, selectorData, data)).expectSubscription().verifyComplete(); + assertEquals("/shenyu/123", rewriteExchange.getAttributes().get(Constants.REWRITE_URI)); + } + + @Test + public void shouldNotThrowWhenOnlyReplaceContainsPlaceholder() { + RuleData data = new RuleData(); + data.setHandle("{\"regex\":\"/shenyu/.*\",\"replace\":\"/new/{id}\"}"); + RewriteHandle rewriteHandle = GsonUtils.getGson().fromJson(data.getHandle(), RewriteHandle.class); + RewritePluginDataHandler.CACHED_HANDLE.get().cachedHandle(CacheKeyUtils.INST.getKey(data), rewriteHandle); + when(chain.execute(exchange)).thenReturn(Mono.empty()); + SelectorData selectorData = mock(SelectorData.class); + StepVerifier.create(rewritePlugin.doExecute(exchange, chain, selectorData, data)).expectSubscription().verifyComplete(); + assertEquals("/new/{id}", exchange.getAttributes().get(Constants.REWRITE_URI)); + } + @Test public void testSkip() { final boolean result = rewritePlugin.skip(exchange);