You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2020/12/12 07:31:39 UTC

[servicecomb-java-chassis] branch master updated: [SCB-2074]using servicecomb:// instead of cse:// (#2122)

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 625d43a  [SCB-2074]using servicecomb:// instead of cse:// (#2122)
625d43a is described below

commit 625d43a095f87bdb7610c0aad7da16abb313263f
Author: bao liu <bi...@qq.com>
AuthorDate: Sat Dec 12 15:31:28 2020 +0800

    [SCB-2074]using servicecomb:// instead of cse:// (#2122)
---
 .../apache/servicecomb/common/rest/RestConst.java  |  4 ++
 .../servicecomb/demo/crossapp/CrossappClient.java  |  2 +
 .../demo/springmvc/client/TestRestTemplate.java    |  6 +++
 .../springmvc/reference/CseRestTemplate.java       |  4 +-
 .../springmvc/reference/CseUriTemplateHandler.java | 59 +++++++++++++++++-----
 5 files changed, 61 insertions(+), 14 deletions(-)

diff --git a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/RestConst.java b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/RestConst.java
index 454ac62..722775f 100644
--- a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/RestConst.java
+++ b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/RestConst.java
@@ -29,8 +29,12 @@ public final class RestConst {
 
   public static final String SCHEME = "cse";
 
+  public static final String SCHEME_NEW = "servicecomb";
+
   public static final String URI_PREFIX = SCHEME + "://";
 
+  public static final String URI_PREFIX_NEW = SCHEME_NEW + "://";
+
   // in HttpServletRequest attribute
   public static final String PATH_PARAMETERS = "servicecomb-paths";
 
diff --git a/demo/demo-crossapp/crossapp-client/src/main/java/org/apache/servicecomb/demo/crossapp/CrossappClient.java b/demo/demo-crossapp/crossapp-client/src/main/java/org/apache/servicecomb/demo/crossapp/CrossappClient.java
index 9261620..d28c41b 100644
--- a/demo/demo-crossapp/crossapp-client/src/main/java/org/apache/servicecomb/demo/crossapp/CrossappClient.java
+++ b/demo/demo-crossapp/crossapp-client/src/main/java/org/apache/servicecomb/demo/crossapp/CrossappClient.java
@@ -58,6 +58,8 @@ public class CrossappClient {
     RestTemplate restTemplate = RestTemplateBuilder.create();
     result = restTemplate.getForObject("cse://appServer:appService/helloworld/hello", String.class);
     TestMgr.check("hello world", result);
+    result = restTemplate.getForObject("servicecomb://appServer:appService/helloworld/hello", String.class);
+    TestMgr.check("hello world", result);
 
     result = helloWorld.sayHello();
     TestMgr.check("hello world", result);
diff --git a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestRestTemplate.java b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestRestTemplate.java
index 1652e22..5b7ad37 100644
--- a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestRestTemplate.java
+++ b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/TestRestTemplate.java
@@ -53,12 +53,18 @@ public class TestRestTemplate {
     ResponseEntity<Void> resultEntity = restTemplate
         .getForEntity("cse://springmvc/codeFirstSpringmvc/testVoidInRestTemplate", Void.class);
     Assert.isTrue(200 == resultEntity.getStatusCodeValue(), "Void return type invocation failed");
+    resultEntity = restTemplate
+        .getForEntity("servicecomb://springmvc/codeFirstSpringmvc/testVoidInRestTemplate", Void.class);
+    Assert.isTrue(200 == resultEntity.getStatusCodeValue(), "Void return type invocation failed");
   }
 
   private void checkAllVoidTestResult() {
     ResponseEntity<Boolean> resultEntity = restTemplate
         .getForEntity("cse://springmvc/codeFirstSpringmvc/checkVoidResult", boolean.class);
     Assert.isTrue(resultEntity.getBody(), "not all void test is passed");
+    restTemplate
+        .getForEntity("servicecomb://springmvc/codeFirstSpringmvc/checkVoidResult", boolean.class);
+    Assert.isTrue(resultEntity.getBody(), "not all void test is passed");
   }
 
   private void checkQueryObject() {
diff --git a/providers/provider-springmvc/src/main/java/org/apache/servicecomb/provider/springmvc/reference/CseRestTemplate.java b/providers/provider-springmvc/src/main/java/org/apache/servicecomb/provider/springmvc/reference/CseRestTemplate.java
index 8f25d4e..c9b98d3 100644
--- a/providers/provider-springmvc/src/main/java/org/apache/servicecomb/provider/springmvc/reference/CseRestTemplate.java
+++ b/providers/provider-springmvc/src/main/java/org/apache/servicecomb/provider/springmvc/reference/CseRestTemplate.java
@@ -172,11 +172,11 @@ public class CseRestTemplate extends AcceptableRestTemplate {
 
   @Override
   public boolean isAcceptable(String uri) {
-    return uri.startsWith(RestConst.URI_PREFIX);
+    return uri.startsWith(RestConst.URI_PREFIX) || uri.startsWith(RestConst.URI_PREFIX_NEW);
   }
 
   @Override
   public boolean isAcceptable(URI uri) {
-    return RestConst.SCHEME.equals(uri.getScheme());
+    return RestConst.SCHEME.equals(uri.getScheme()) || RestConst.SCHEME_NEW.equals(uri.getScheme());
   }
 }
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 41f2e81..2fe71de 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
@@ -16,13 +16,13 @@
  */
 package org.apache.servicecomb.provider.springmvc.reference;
 
-import java.lang.reflect.Field;
 import java.net.URI;
 import java.net.URISyntaxException;
 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.ReflectionUtils;
 import org.springframework.web.util.UriComponents;
 import org.springframework.web.util.UriComponentsBuilder;
 
@@ -34,10 +34,30 @@ import org.springframework.web.util.UriComponentsBuilder;
 @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 Field hostField = ReflectionUtils.findField(UriComponentsBuilder.class, "host");
+  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 CseUriTemplateHandler() {
-    ReflectionUtils.makeAccessible(hostField);
     setStrictEncoding(true);
   }
 
@@ -45,21 +65,31 @@ public class CseUriTemplateHandler extends org.springframework.web.util.DefaultU
   protected URI expandInternal(String uriTemplate, Map<String, ?> uriVariables) {
     UriComponentsBuilder uriComponentsBuilder = initUriComponentsBuilder(uriTemplate);
     UriComponents uriComponents = expandAndEncode(uriComponentsBuilder, uriVariables);
-    return createUri(uriTemplate, uriComponentsBuilder, uriComponents);
+    return createUri(uriTemplate, uriComponents);
   }
 
   @Override
   protected URI expandInternal(String uriTemplate, Object... uriVariables) {
     UriComponentsBuilder uriComponentsBuilder = initUriComponentsBuilder(uriTemplate);
     UriComponents uriComponents = expandAndEncode(uriComponentsBuilder, uriVariables);
-    return createUri(uriTemplate, uriComponentsBuilder, uriComponents);
+    return createUri(uriTemplate, uriComponents);
   }
 
-  private URI createUri(String uriTemplate, UriComponentsBuilder builder, UriComponents uriComponents) {
+  private URI createUri(String uriTemplate, UriComponents uriComponents) {
     String strUri = uriComponents.toUriString();
 
-    if (isCrossApp(uriTemplate, builder)) {
-      int idx = strUri.indexOf('/', RestConst.URI_PREFIX.length());
+    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);
     }
 
@@ -71,9 +101,14 @@ public class CseUriTemplateHandler extends org.springframework.web.util.DefaultU
     }
   }
 
-  protected boolean isCrossApp(String uriTemplate, UriComponentsBuilder builder) {
-    String host = (String) ReflectionUtils.getField(hostField, builder);
-    int pos = RestConst.URI_PREFIX.length() + host.length();
+  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) == ':';
   }
 }