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) == ':';
}
}