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

liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git


The following commit(s) were added to refs/heads/master by this push:
     new fc7625143  [SCB-2790]CseUriTemplateHandler implements 
DefaultUriBuilderFactory instead of deprecated api (#3771)
fc7625143 is described below

commit fc7625143101298850de8cd0954b9096334ee93a
Author: liubao68 <[email protected]>
AuthorDate: Sat May 6 16:42:14 2023 +0800

     [SCB-2790]CseUriTemplateHandler implements DefaultUriBuilderFactory 
instead of deprecated api (#3771)
---
 .../jaxrs/client/TestQueryParamWithListSchema.java |  11 +-
 .../demo/springmvc/SpringmvcClient.java            |   8 ++
 .../springmvc/reference/CseClientHttpRequest.java  |   9 +-
 .../springmvc/reference/CseUriTemplateHandler.java | 156 +++------------------
 .../reference/TestCseUriTemplateHandler.java       |  21 ++-
 5 files changed, 64 insertions(+), 141 deletions(-)

diff --git 
a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/TestQueryParamWithListSchema.java
 
b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/TestQueryParamWithListSchema.java
index 40c9b8d0e..bc061d33a 100644
--- 
a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/TestQueryParamWithListSchema.java
+++ 
b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/TestQueryParamWithListSchema.java
@@ -66,12 +66,19 @@ public class TestQueryParamWithListSchema implements 
CategorizedTestCase {
   }
 
   private void testSSV() {
-    TestMgr.check("2:[1, 2]",
+    TestMgr.check("1:[1%202]",
         
restTemplate.getForObject("cse://jaxrs/queryList/queryListSSV?queryList=1%202", 
String.class));
-    TestMgr.check("2:[, ]",
+    TestMgr.check("1:[%20]",
         
restTemplate.getForObject("cse://jaxrs/queryList/queryListSSV?queryList=%20", 
String.class));
     TestMgr.check("1:[]",
         
restTemplate.getForObject("cse://jaxrs/queryList/queryListSSV?queryList=", 
String.class));
+
+    TestMgr.check("2:[1, 2]",
+        
restTemplate.getForObject("cse://jaxrs/queryList/queryListSSV?queryList={1}", 
String.class, "1 2"));
+    TestMgr.check("2:[, ]",
+        
restTemplate.getForObject("cse://jaxrs/queryList/queryListSSV?queryList={1}", 
String.class, " "));
+    TestMgr.check("1:[]",
+        
restTemplate.getForObject("cse://jaxrs/queryList/queryListSSV?queryList=", 
String.class));
   }
 
   private void testTSVHighway() {
diff --git 
a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/SpringmvcClient.java
 
b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/SpringmvcClient.java
index 688b998c9..7956bf99d 100644
--- 
a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/SpringmvcClient.java
+++ 
b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/SpringmvcClient.java
@@ -239,6 +239,14 @@ public class SpringmvcClient {
         template.getForObject(prefix + "/controller/sayhi?name=world",
             String.class));
 
+    TestMgr.check("hi world boot [world boot]",
+        template.getForObject(prefix + "/controller/sayhi?name=world boot",
+            String.class));
+
+    TestMgr.check("hi world boot [world boot]",
+        template.getForObject(prefix + "/controller/sayhi?name=world+boot",
+            String.class));
+
     TestMgr.check("hi world1 [world1]",
         template.getForObject(prefix + "/controller/sayhi?name={name}",
             String.class,
diff --git 
a/providers/provider-springmvc/src/main/java/org/apache/servicecomb/provider/springmvc/reference/CseClientHttpRequest.java
 
b/providers/provider-springmvc/src/main/java/org/apache/servicecomb/provider/springmvc/reference/CseClientHttpRequest.java
index 25772e72e..7e9def4d3 100644
--- 
a/providers/provider-springmvc/src/main/java/org/apache/servicecomb/provider/springmvc/reference/CseClientHttpRequest.java
+++ 
b/providers/provider-springmvc/src/main/java/org/apache/servicecomb/provider/springmvc/reference/CseClientHttpRequest.java
@@ -39,6 +39,7 @@ import 
org.apache.servicecomb.core.invocation.InvocationFactory;
 import org.apache.servicecomb.core.provider.consumer.InvokerUtils;
 import 
org.apache.servicecomb.core.provider.consumer.MicroserviceReferenceConfig;
 import org.apache.servicecomb.core.provider.consumer.ReferenceConfig;
+import org.apache.servicecomb.registry.definition.DefinitionConst;
 import org.apache.servicecomb.swagger.invocation.Response;
 import org.apache.servicecomb.swagger.invocation.context.InvocationContext;
 import org.apache.servicecomb.swagger.invocation.exception.ExceptionFactory;
@@ -177,7 +178,7 @@ public class CseClientHttpRequest implements 
ClientHttpRequest {
   }
 
   protected RequestMeta createRequestMeta(String httpMethod, URI uri) {
-    String microserviceName = uri.getAuthority();
+    String microserviceName = parseMicroserviceName(uri);
 
     MicroserviceReferenceConfig microserviceReferenceConfig = 
SCBEngine.getInstance()
         .createMicroserviceReferenceConfig(microserviceName);
@@ -200,6 +201,12 @@ public class CseClientHttpRequest implements 
ClientHttpRequest {
     return new RequestMeta(referenceConfig, swaggerRestOperation, pathParams);
   }
 
+  private String parseMicroserviceName(URI uri) {
+    String microserviceName = uri.getAuthority();
+    return 
microserviceName.replace(CseUriTemplateHandler.APP_SERVICE_SEPARATOR_INTERNAL,
+        DefinitionConst.APP_SERVICE_SEPARATOR);
+  }
+
   protected String findUriPath(URI uri) {
     return uri.getRawPath();
   }
diff --git 
a/providers/provider-springmvc/src/main/java/org/apache/servicecomb/provider/springmvc/reference/CseUriTemplateHandler.java
 
b/providers/provider-springmvc/src/main/java/org/apache/servicecomb/provider/springmvc/reference/CseUriTemplateHandler.java
index f41d6490a..9cb98b1a7 100644
--- 
a/providers/provider-springmvc/src/main/java/org/apache/servicecomb/provider/springmvc/reference/CseUriTemplateHandler.java
+++ 
b/providers/provider-springmvc/src/main/java/org/apache/servicecomb/provider/springmvc/reference/CseUriTemplateHandler.java
@@ -17,158 +17,42 @@
 package org.apache.servicecomb.provider.springmvc.reference;
 
 import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.List;
 import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 import org.apache.servicecomb.common.rest.RestConst;
-import org.springframework.util.Assert;
-import org.springframework.util.StringUtils;
-import org.springframework.web.util.UriComponents;
-import org.springframework.web.util.UriComponentsBuilder;
+import org.apache.servicecomb.registry.definition.DefinitionConst;
+import org.springframework.web.util.DefaultUriBuilderFactory;
 
-/**
- * 默认不支持下面第1个场景,需要做出修正
- * cse://app:ms/path to cse://app/ms/path
- * cse://ms/path to cse://ms/path
- */
-@SuppressWarnings("deprecation")
-// TODO : upgrade to spring 5 will having warning's , we'll fix it later
-public class CseUriTemplateHandler extends 
org.springframework.web.util.DefaultUriTemplateHandler {
-  private static final String SCHEME_PATTERN = "([^:/?#]+):";
-
-  private static final String USERINFO_PATTERN = "([^@\\[/?#]*)";
-
-  private static final String HOST_IPV4_PATTERN = "[^\\[/?#:]*";
-
-  private static final String HOST_IPV6_PATTERN = 
"\\[[\\p{XDigit}:.]*[%\\p{Alnum}]*]";
-
-  private static final String HOST_PATTERN = "(" + HOST_IPV6_PATTERN + "|" + 
HOST_IPV4_PATTERN + ")";
-
-  private static final String PORT_PATTERN = "(\\d*(?:\\{[^/]+?})?)";
-
-  private static final String PATH_PATTERN = "([^?#]*)";
-
-  private static final String QUERY_PATTERN = "([^#]*)";
-
-  private static final String LAST_PATTERN = "(.*)";
-
-  // Regex patterns that matches URIs. See RFC 3986, appendix B
-  private static final Pattern URI_PATTERN = Pattern.compile(
-      "^(" + SCHEME_PATTERN + ")?" + "(//(" + USERINFO_PATTERN + "@)?" + 
HOST_PATTERN + "(:" + PORT_PATTERN +
-          ")?" + ")?" + PATH_PATTERN + "(\\?" + QUERY_PATTERN + ")?" + "(#" + 
LAST_PATTERN + ")?");
+public class CseUriTemplateHandler extends DefaultUriBuilderFactory {
+  public static final String APP_SERVICE_SEPARATOR_INTERNAL = ".";
 
   public CseUriTemplateHandler() {
-    setStrictEncoding(true);
   }
 
   @Override
-  protected URI expandInternal(String uriTemplate, Map<String, ?> 
uriVariables) {
-    UriComponentsBuilder uriComponentsBuilder = 
initUriComponentsBuilder(uriTemplate);
-    UriComponents uriComponents = expandAndEncode(uriComponentsBuilder, 
uriVariables);
-    return createUri(uriTemplate, uriComponents);
+  public URI expand(String uriTemplate, Map<String, ?> uriVars) {
+    return super.expand(parseUrl(uriTemplate), uriVars);
   }
 
   @Override
-  protected URI expandInternal(String uriTemplate, Object... uriVariables) {
-    UriComponentsBuilder uriComponentsBuilder = 
initUriComponentsBuilder(uriTemplate);
-    UriComponents uriComponents = expandAndEncode(uriComponentsBuilder, 
uriVariables);
-    return createUri(uriTemplate, uriComponents);
+  public URI expand(String uriTemplate, Object... uriVars) {
+    return super.expand(parseUrl(uriTemplate), uriVars);
   }
 
-  @Override
-  protected UriComponentsBuilder initUriComponentsBuilder(String uriTemplate) {
-    UriComponentsBuilder builder = fromUriString(uriTemplate);
-    if (shouldParsePath() && !isStrictEncoding()) {
-      List<String> pathSegments = builder.build().getPathSegments();
-      builder.replacePath(null);
-      for (String pathSegment : pathSegments) {
-        builder.pathSegment(pathSegment);
-      }
+  private static String parseUrl(String uriTemplate) {
+    int indexSchema = -1;
+    if (uriTemplate.startsWith(RestConst.URI_PREFIX)) {
+      indexSchema = RestConst.URI_PREFIX.length();
     }
-    return builder;
-  }
-
-  private static UriComponentsBuilder fromUriString(String uri) {
-    Assert.notNull(uri, "URI must not be null");
-    Matcher matcher = URI_PATTERN.matcher(uri);
-    if (matcher.matches()) {
-      UriComponentsBuilder builder = UriComponentsBuilder.newInstance();
-      String scheme = matcher.group(2);
-      String userInfo = matcher.group(5);
-      String host = matcher.group(6);
-      String port = matcher.group(8);
-      String path = matcher.group(9);
-      String query = matcher.group(11);
-      String fragment = matcher.group(13);
-      boolean opaque = false;
-      if (StringUtils.hasLength(scheme)) {
-        String rest = uri.substring(scheme.length());
-        if (!rest.startsWith(":/")) {
-          opaque = true;
-        }
-      }
-      builder.scheme(scheme);
-      if (opaque) {
-        String ssp = uri.substring(scheme.length()).substring(1);
-        if (StringUtils.hasLength(fragment)) {
-          ssp = ssp.substring(0, ssp.length() - (fragment.length() + 1));
-        }
-        builder.schemeSpecificPart(ssp);
-      } else {
-        builder.userInfo(userInfo);
-        builder.host(host);
-        if (StringUtils.hasLength(port)) {
-          builder.port(port);
-        }
-        builder.path(path);
-        builder.query(query);
-      }
-      if (StringUtils.hasText(fragment)) {
-        builder.fragment(fragment);
-      }
-      return builder;
-    } else {
-      throw new IllegalArgumentException("[" + uri + "] is not a valid URI");
+    if (uriTemplate.startsWith(RestConst.URI_PREFIX_NEW)) {
+      indexSchema = RestConst.URI_PREFIX_NEW.length();
     }
-  }
-
-  private URI createUri(String uriTemplate, UriComponents uriComponents) {
-    String strUri = uriComponents.toUriString();
-
-    Matcher matcher = URI_PATTERN.matcher(uriTemplate);
-    matcher.matches(); // should always be true
-    String scheme = matcher.group(2);
-    String host = matcher.group(6);
-
-    if (isCrossApp(uriTemplate, scheme, host)) {
-      int idx;
-      if (RestConst.SCHEME.equals(scheme)) {
-        idx = strUri.indexOf('/', RestConst.URI_PREFIX.length());
-      } else {
-        idx = strUri.indexOf('/', RestConst.URI_PREFIX_NEW.length());
-      }
-      strUri = strUri.substring(0, idx) + ":" + strUri.substring(idx + 1);
+    if (indexSchema != -1) {
+      int indexPath = uriTemplate.indexOf("/", indexSchema);
+      String host = uriTemplate.substring(indexSchema, indexPath);
+      host = host.replace(DefinitionConst.APP_SERVICE_SEPARATOR, 
APP_SERVICE_SEPARATOR_INTERNAL);
+      return uriTemplate.substring(0, indexSchema) + host + 
uriTemplate.substring(indexPath);
     }
-
-    try {
-      // Avoid further encoding (in the case of strictEncoding=true)
-      return new URI(strUri);
-    } catch (URISyntaxException ex) {
-      throw new IllegalStateException("Could not create URI object: " + 
ex.getMessage(), ex);
-    }
-  }
-
-  private boolean isCrossApp(String uriTemplate, String scheme, String host) {
-    int pos;
-    if (RestConst.SCHEME.equals(scheme)) {
-      pos = RestConst.URI_PREFIX.length() + host.length();
-    } else {
-      pos = RestConst.URI_PREFIX_NEW.length() + host.length();
-    }
-
-    return uriTemplate.charAt(pos) == ':';
+    return uriTemplate;
   }
 }
diff --git 
a/providers/provider-springmvc/src/test/java/org/apache/servicecomb/provider/springmvc/reference/TestCseUriTemplateHandler.java
 
b/providers/provider-springmvc/src/test/java/org/apache/servicecomb/provider/springmvc/reference/TestCseUriTemplateHandler.java
index a692262ef..de9d2db85 100644
--- 
a/providers/provider-springmvc/src/test/java/org/apache/servicecomb/provider/springmvc/reference/TestCseUriTemplateHandler.java
+++ 
b/providers/provider-springmvc/src/test/java/org/apache/servicecomb/provider/springmvc/reference/TestCseUriTemplateHandler.java
@@ -28,16 +28,33 @@ public class TestCseUriTemplateHandler {
   public void testCrossApp() {
     CseUriTemplateHandler handler = new CseUriTemplateHandler();
     URI uri = handler.expand("cse://{ap}{p}:ms/{path}?q={query}", "ap", "p", 
"path", "query");
-    Assertions.assertEquals("cse://app:ms/path?q=query", uri.toString());
+    Assertions.assertEquals("cse://app.ms/path?q=query", uri.toString());
 
     Map<String, String> vars = new HashMap<>();
     vars.put("app", "app");
     vars.put("path", "path");
     vars.put("q", "query");
     uri = handler.expand("cse://{app}:ms/{path}?q={q}", vars);
-    Assertions.assertEquals("cse://app:ms/path?q=query", uri.toString());
+    Assertions.assertEquals("cse://app.ms/path?q=query", uri.toString());
 
     uri = handler.expand("cse://ms/{path}?q={query}", "path", "query");
     Assertions.assertEquals("cse://ms/path?q=query", uri.toString());
   }
+
+  @Test
+  public void testCrossAppServiceComb() {
+    CseUriTemplateHandler handler = new CseUriTemplateHandler();
+    URI uri = handler.expand("servicecomb://{ap}{p}:ms/{path}?q={query}", 
"ap", "p", "path", "query");
+    Assertions.assertEquals("servicecomb://app.ms/path?q=query", 
uri.toString());
+
+    Map<String, String> vars = new HashMap<>();
+    vars.put("app", "app");
+    vars.put("path", "path");
+    vars.put("q", "query");
+    uri = handler.expand("servicecomb://{app}:ms/{path}?q={q}", vars);
+    Assertions.assertEquals("servicecomb://app.ms/path?q=query", 
uri.toString());
+
+    uri = handler.expand("servicecomb://ms/{path}?q={query}", "path", "query");
+    Assertions.assertEquals("servicecomb://ms/path?q=query", uri.toString());
+  }
 }

Reply via email to