From ec327bc2ea9adcc8a3dc992c71596b46bc16f928 Mon Sep 17 00:00:00 2001 From: oxsean Date: Thu, 20 Jun 2024 05:40:08 +0000 Subject: [PATCH] Some rest bugfix --- .../http12/message/codec/CodecUtils.java | 8 +++ .../rest/argument/GeneralTypeConverter.java | 25 ++++++-- .../DefaultRequestMappingRegistry.java | 9 +-- .../rest/mapping/RequestMappingResolver.java | 6 +- .../tri/rest/mapping/meta/MethodMeta.java | 16 ++++- .../mapping/meta/MethodParameterMeta.java | 6 +- .../tri/rest/mapping/meta/ServiceMeta.java | 14 +++- .../basic/BasicRequestMappingResolver.java | 5 +- .../protocol/tri/rest/RestProtocolTest.groovy | 64 ++++++++++++++++--- .../tri/rest/service/DemoService.java | 12 +++- .../tri/rest/service/DemoServiceImpl.java | 38 ++++++++++- .../rpc/protocol/tri/test/TestRunner.java | 10 +++ .../rpc/protocol/tri/test/TestRunnerImpl.java | 21 ++++++ 13 files changed, 204 insertions(+), 30 deletions(-) diff --git a/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/message/codec/CodecUtils.java b/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/message/codec/CodecUtils.java index 281ee15eb9..98428bb9a8 100644 --- a/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/message/codec/CodecUtils.java +++ b/dubbo-remoting/dubbo-remoting-http12/src/main/java/org/apache/dubbo/remoting/http12/message/codec/CodecUtils.java @@ -50,12 +50,20 @@ public final class CodecUtils { .createCodec(url, frameworkModel, mediaType); } + public HttpMessageDecoder determineHttpMessageDecoder(String mediaType) { + return determineHttpMessageDecoder(null, null, mediaType); + } + public HttpMessageEncoder determineHttpMessageEncoder(URL url, FrameworkModel frameworkModel, String mediaType) { return determineHttpMessageEncoderFactory(mediaType) .orElseThrow(() -> new UnsupportedMediaTypeException(mediaType)) .createCodec(url, frameworkModel, mediaType); } + public HttpMessageEncoder determineHttpMessageEncoder(String mediaType) { + return determineHttpMessageEncoder(null, null, mediaType); + } + public Optional determineHttpMessageDecoderFactory(String mediaType) { Assert.notNull(mediaType, "mediaType must not be null"); return decoderCache.computeIfAbsent(mediaType, k -> { diff --git a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/argument/GeneralTypeConverter.java b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/argument/GeneralTypeConverter.java index ee9fb15221..4752512f41 100644 --- a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/argument/GeneralTypeConverter.java +++ b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/argument/GeneralTypeConverter.java @@ -25,6 +25,9 @@ import org.apache.dubbo.common.utils.DateUtils; import org.apache.dubbo.common.utils.JsonUtils; import org.apache.dubbo.common.utils.StringUtils; import org.apache.dubbo.remoting.http12.HttpCookie; +import org.apache.dubbo.remoting.http12.HttpRequest.FileUpload; +import org.apache.dubbo.remoting.http12.message.MediaType; +import org.apache.dubbo.remoting.http12.message.codec.CodecUtils; import org.apache.dubbo.rpc.model.FrameworkModel; import org.apache.dubbo.rpc.protocol.tri.rest.RestException; import org.apache.dubbo.rpc.protocol.tri.rest.RestParameterException; @@ -93,6 +96,7 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import java.util.regex.Pattern; +import static java.nio.charset.StandardCharsets.UTF_8; import static org.apache.dubbo.common.utils.StringUtils.tokenizeToList; import static org.apache.dubbo.rpc.protocol.tri.rest.util.TypeUtils.getActualGenericType; import static org.apache.dubbo.rpc.protocol.tri.rest.util.TypeUtils.getActualType; @@ -104,13 +108,16 @@ public class GeneralTypeConverter implements TypeConverter { private static final Logger LOGGER = LoggerFactory.getLogger(GeneralTypeConverter.class); private final ConverterUtil converterUtil; + private final CodecUtils codecUtils; public GeneralTypeConverter() { converterUtil = null; + codecUtils = null; } public GeneralTypeConverter(FrameworkModel frameworkModel) { converterUtil = frameworkModel.getBeanFactory().getOrRegisterBean(ConverterUtil.class); + codecUtils = frameworkModel.getBeanFactory().getOrRegisterBean(CodecUtils.class); } @Override @@ -255,7 +262,7 @@ public class GeneralTypeConverter implements TypeConverter { case "java.lang.Class": return TypeUtils.loadClass(str); case "[B": - return str.getBytes(StandardCharsets.UTF_8); + return str.getBytes(UTF_8); case "[C": return str.toCharArray(); case "java.util.OptionalInt": @@ -432,7 +439,7 @@ public class GeneralTypeConverter implements TypeConverter { switch (targetClass.getName()) { case "java.lang.String": - return new String(bytes, StandardCharsets.UTF_8); + return new String(bytes, UTF_8); case "java.lang.Double": case "double": return ByteBuffer.wrap(bytes).getDouble(); @@ -568,6 +575,11 @@ public class GeneralTypeConverter implements TypeConverter { return StreamUtils.readBytes(is); } } + if (source instanceof FileUpload) { + try (InputStream is = ((FileUpload) source).inputStream()) { + return StreamUtils.readBytes(is); + } + } if (source instanceof Character) { char c = (Character) source; return new byte[] {(byte) (c >> 8), (byte) c}; @@ -1078,10 +1090,15 @@ public class GeneralTypeConverter implements TypeConverter { return false; } - private static Object jsonToObject(String value, Type targetType) { + private Object jsonToObject(String value, Type targetType) { if (isMaybeJSON(value)) { try { - return JsonUtils.toJavaObject(value, targetType); + if (codecUtils == null || !(targetType instanceof Class)) { + return JsonUtils.toJavaObject(value, targetType); + } + return codecUtils + .determineHttpMessageDecoder(MediaType.APPLICATION_JSON.getName()) + .decode(new ByteArrayInputStream(value.getBytes(UTF_8)), (Class) targetType); } catch (Throwable t) { LOGGER.debug("Failed to parse [{}] from json string [{}]", targetType, value, t); } diff --git a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/DefaultRequestMappingRegistry.java b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/DefaultRequestMappingRegistry.java index 73b40c5245..8cfa7856e3 100644 --- a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/DefaultRequestMappingRegistry.java +++ b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/DefaultRequestMappingRegistry.java @@ -100,16 +100,16 @@ public final class DefaultRequestMappingRegistry implements RequestMappingRegist new MethodWalker().walk(service.getClass(), (classes, consumer) -> { for (int i = 0, size = resolvers.size(); i < size; i++) { RequestMappingResolver resolver = resolvers.get(i); - ServiceMeta serviceMeta = new ServiceMeta(classes, service, url, resolver.getRestToolKit()); - if (!resolver.accept(serviceMeta, sd)) { + ServiceMeta serviceMeta = new ServiceMeta(classes, sd, service, url, resolver.getRestToolKit()); + if (!resolver.accept(serviceMeta)) { continue; } RequestMapping classMapping = resolver.resolve(serviceMeta); consumer.accept((methods) -> { Method method = methods.get(0); MethodDescriptor md = sd.getMethod(method.getName(), method.getParameterTypes()); - MethodMeta methodMeta = new MethodMeta(methods, serviceMeta); - if (!resolver.accept(methodMeta, md)) { + MethodMeta methodMeta = new MethodMeta(methods, md, serviceMeta); + if (!resolver.accept(methodMeta)) { return; } RequestMapping methodMapping = resolver.resolve(methodMeta); @@ -122,6 +122,7 @@ public final class DefaultRequestMappingRegistry implements RequestMappingRegist } md = new ReflectionMethodDescriptor(method); ((ReflectionServiceDescriptor) sd).addMethod(md); + methodMeta.setMethodDescriptor(md); } if (classMapping != null) { methodMapping = classMapping.combine(methodMapping); diff --git a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/RequestMappingResolver.java b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/RequestMappingResolver.java index 44a179ea00..803792f1a4 100644 --- a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/RequestMappingResolver.java +++ b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/RequestMappingResolver.java @@ -18,8 +18,6 @@ package org.apache.dubbo.rpc.protocol.tri.rest.mapping; import org.apache.dubbo.common.extension.ExtensionScope; import org.apache.dubbo.common.extension.SPI; -import org.apache.dubbo.rpc.model.MethodDescriptor; -import org.apache.dubbo.rpc.model.ServiceDescriptor; import org.apache.dubbo.rpc.protocol.tri.rest.mapping.meta.MethodMeta; import org.apache.dubbo.rpc.protocol.tri.rest.mapping.meta.ServiceMeta; import org.apache.dubbo.rpc.protocol.tri.rest.util.RestToolKit; @@ -29,13 +27,13 @@ public interface RequestMappingResolver { RestToolKit getRestToolKit(); - default boolean accept(ServiceMeta serviceMeta, ServiceDescriptor serviceDescriptor) { + default boolean accept(ServiceMeta serviceMeta) { return true; } RequestMapping resolve(ServiceMeta serviceMeta); - default boolean accept(MethodMeta methodMeta, MethodDescriptor methodDescriptor) { + default boolean accept(MethodMeta methodMeta) { return true; } diff --git a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/meta/MethodMeta.java b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/meta/MethodMeta.java index 4dc7429e68..3b09ff120f 100644 --- a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/meta/MethodMeta.java +++ b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/meta/MethodMeta.java @@ -16,6 +16,8 @@ */ package org.apache.dubbo.rpc.protocol.tri.rest.mapping.meta; +import org.apache.dubbo.rpc.model.MethodDescriptor; + import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Method; import java.lang.reflect.Parameter; @@ -27,13 +29,15 @@ public final class MethodMeta extends AnnotationSupport { private final List hierarchy; private final Method method; + private MethodDescriptor methodDescriptor; private ParameterMeta[] parameters; private final ServiceMeta serviceMeta; - public MethodMeta(List hierarchy, ServiceMeta serviceMeta) { + public MethodMeta(List hierarchy, MethodDescriptor methodDescriptor, ServiceMeta serviceMeta) { super(serviceMeta.getToolKit()); this.hierarchy = hierarchy; - method = hierarchy.get(0); + method = methodDescriptor == null ? hierarchy.get(0) : methodDescriptor.getMethod(); + this.methodDescriptor = methodDescriptor; this.serviceMeta = serviceMeta; } @@ -72,6 +76,14 @@ public final class MethodMeta extends AnnotationSupport { return method; } + public MethodDescriptor getMethodDescriptor() { + return methodDescriptor; + } + + public void setMethodDescriptor(MethodDescriptor methodDescriptor) { + this.methodDescriptor = methodDescriptor; + } + public ParameterMeta[] getParameters() { return parameters; } diff --git a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/meta/MethodParameterMeta.java b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/meta/MethodParameterMeta.java index 4e769e9043..845acf7d60 100644 --- a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/meta/MethodParameterMeta.java +++ b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/meta/MethodParameterMeta.java @@ -16,6 +16,9 @@ */ package org.apache.dubbo.rpc.protocol.tri.rest.mapping.meta; +import org.apache.dubbo.rpc.model.MethodDescriptor; +import org.apache.dubbo.rpc.model.MethodDescriptor.RpcType; + import java.lang.reflect.AnnotatedElement; import java.lang.reflect.Method; import java.lang.reflect.Parameter; @@ -47,7 +50,8 @@ public final class MethodParameterMeta extends ParameterMeta { @Override public boolean isSingle() { - return methodMeta.getMethod().getParameterCount() == 1; + MethodDescriptor methodDescriptor = methodMeta.getMethodDescriptor(); + return methodDescriptor.getRpcType() != RpcType.UNARY || methodDescriptor.getParameterClasses().length == 1; } @Override diff --git a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/meta/ServiceMeta.java b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/meta/ServiceMeta.java index f9f68ca6f5..28d940205e 100644 --- a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/meta/ServiceMeta.java +++ b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/meta/ServiceMeta.java @@ -17,6 +17,7 @@ package org.apache.dubbo.rpc.protocol.tri.rest.mapping.meta; import org.apache.dubbo.common.URL; +import org.apache.dubbo.rpc.model.ServiceDescriptor; import org.apache.dubbo.rpc.protocol.tri.rest.util.PathUtils; import org.apache.dubbo.rpc.protocol.tri.rest.util.RestToolKit; @@ -30,14 +31,21 @@ public final class ServiceMeta extends AnnotationSupport { private final List> hierarchy; private final Class type; private final Object service; + private final ServiceDescriptor serviceDescriptor; private final URL url; private final String contextPath; private List exceptionHandlers; - public ServiceMeta(Collection> hierarchy, Object service, URL url, RestToolKit toolKit) { + public ServiceMeta( + Collection> hierarchy, + ServiceDescriptor serviceDescriptor, + Object service, + URL url, + RestToolKit toolKit) { super(toolKit); this.hierarchy = new ArrayList<>(hierarchy); + this.serviceDescriptor = serviceDescriptor; type = this.hierarchy.get(0); this.service = service; this.url = url; @@ -52,6 +60,10 @@ public final class ServiceMeta extends AnnotationSupport { return type; } + public ServiceDescriptor getServiceDescriptor() { + return serviceDescriptor; + } + public Object getService() { return service; } diff --git a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/basic/BasicRequestMappingResolver.java b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/basic/BasicRequestMappingResolver.java index c342d9b122..269c315f46 100644 --- a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/basic/BasicRequestMappingResolver.java +++ b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/basic/BasicRequestMappingResolver.java @@ -19,7 +19,6 @@ package org.apache.dubbo.rpc.protocol.tri.rest.support.basic; import org.apache.dubbo.common.extension.Activate; import org.apache.dubbo.common.utils.StringUtils; import org.apache.dubbo.rpc.model.FrameworkModel; -import org.apache.dubbo.rpc.model.MethodDescriptor; import org.apache.dubbo.rpc.protocol.tri.rest.cors.CorsUtils; import org.apache.dubbo.rpc.protocol.tri.rest.mapping.RequestMapping; import org.apache.dubbo.rpc.protocol.tri.rest.mapping.RequestMapping.Builder; @@ -53,8 +52,8 @@ public class BasicRequestMappingResolver implements RequestMappingResolver { } @Override - public boolean accept(MethodMeta methodMeta, MethodDescriptor methodDescriptor) { - return methodDescriptor != null || methodMeta.findAnnotation(Annotations.Mapping) != null; + public boolean accept(MethodMeta methodMeta) { + return methodMeta.getMethodDescriptor() != null || methodMeta.findAnnotation(Annotations.Mapping) != null; } @Override diff --git a/dubbo-rpc/dubbo-rpc-triple/src/test/groovy/org/apache/dubbo/rpc/protocol/tri/rest/RestProtocolTest.groovy b/dubbo-rpc/dubbo-rpc-triple/src/test/groovy/org/apache/dubbo/rpc/protocol/tri/rest/RestProtocolTest.groovy index 9593448b04..e7c0879d41 100644 --- a/dubbo-rpc/dubbo-rpc-triple/src/test/groovy/org/apache/dubbo/rpc/protocol/tri/rest/RestProtocolTest.groovy +++ b/dubbo-rpc/dubbo-rpc-triple/src/test/groovy/org/apache/dubbo/rpc/protocol/tri/rest/RestProtocolTest.groovy @@ -17,7 +17,6 @@ package org.apache.dubbo.rpc.protocol.tri.rest - import org.apache.dubbo.remoting.http12.message.MediaType import org.apache.dubbo.rpc.protocol.tri.rest.service.Book import org.apache.dubbo.rpc.protocol.tri.rest.service.DemoServiceImpl @@ -42,15 +41,37 @@ class RestProtocolTest extends BaseServiceTest { '/hello.yml?name=world' | 'hello world' } - def "post test"() { + def "argument test"() { expect: runner.post(path, body) == output where: - path | body | output - '/postTest' | '["Sam","8"]' | 'Sam is 8 years old' - '/postTest' | '{"name": "Sam", "age": 8}' | 'Sam is 8 years old' - '/postTest?name=Sam' | '{"age": 8}' | 'Sam is 8 years old' - '/postTest?name=Sam' | '{"age": 8}' | 'Sam is 8 years old' + path | body | output + '/argTest' | '["Sam","8"]' | 'Sam is 8 years old' + '/argTest' | '{"name": "Sam", "age": 8}' | 'Sam is 8 years old' + '/argTest?name=Sam' | '{"age": 8}' | 'Sam is 8 years old' + } + + def "bean argument get test"() { + expect: + runner.get(path, Book.class).price == output + where: + path | output + '/beanArgTest' | 0 + '/beanArgTest?quote=5' | 0 + '/beanArgTest?book={"price": 6}' | 6 + '/beanArgTest?book={"price": 6}"e=5' | 5 + } + + def "bean argument post test"() { + expect: + runner.post(path, body, Book.class).price == output + where: + path | body | output + '/beanArgTest' | [] | 0 + '/beanArgTest' | [quote: 5] | 0 + '/beanArgTest' | [book: new Book(price: 6)] | 6 + '/beanArgTest' | [book: new Book(price: 6), quote: 5] | 5 + '/beanArgTest' | [price: 6, quote: 5] | 0 } def "bean test"() { @@ -77,8 +98,8 @@ class RestProtocolTest extends BaseServiceTest { expect: runner.post(request) == output where: - path | output - '/postTest' | 'Sam is 8 years old' + path | output + '/argTest' | 'Sam is 8 years old' } def "override mapping test"() { @@ -110,4 +131,29 @@ class RestProtocolTest extends BaseServiceTest { '/noInterface' | 'ok' '/noInterfaceAndMapping' | '404' } + + def "use interface argument name test"() { + expect: + runner.get(path) contains output + where: + path | output + '/argNameTest?name=Sam' | 'Sam' + } + + def "pb server stream test"() { + expect: + runner.posts(path, body).size() == output + where: + path | body | output + '/pbServerStream' | '{"service": "3"}' | 3 + '/pbServerStream' | '{}' | 0 + } + + def "pb server stream get test"() { + expect: + runner.gets(path).size() == output + where: + path | output + '/pbServerStream?request={"service": "3"}' | 3 + } } diff --git a/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/rest/service/DemoService.java b/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/rest/service/DemoService.java index 5bbabaa705..a2cf6da714 100644 --- a/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/rest/service/DemoService.java +++ b/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/rest/service/DemoService.java @@ -16,14 +16,20 @@ */ package org.apache.dubbo.rpc.protocol.tri.rest.service; +import org.apache.dubbo.common.stream.StreamObserver; import org.apache.dubbo.remoting.http12.rest.Mapping; +import io.grpc.health.v1.HealthCheckRequest; +import io.grpc.health.v1.HealthCheckResponse; + @Mapping("/") public interface DemoService { String hello(String name); - String postTest(String name, int age); + String argTest(String name, int age); + + Book beanArgTest(Book book, Integer quote); Book buy(Book book); @@ -33,4 +39,8 @@ public interface DemoService { String say(String name, Long count); String say(String name); + + String argNameTest(String name); + + void pbServerStream(HealthCheckRequest request, StreamObserver responseObserver); } diff --git a/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/rest/service/DemoServiceImpl.java b/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/rest/service/DemoServiceImpl.java index 1330e69758..cf7f03ace2 100644 --- a/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/rest/service/DemoServiceImpl.java +++ b/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/rest/service/DemoServiceImpl.java @@ -16,8 +16,16 @@ */ package org.apache.dubbo.rpc.protocol.tri.rest.service; +import org.apache.dubbo.common.stream.StreamObserver; +import org.apache.dubbo.common.utils.StringUtils; import org.apache.dubbo.remoting.http12.rest.Mapping; +import io.grpc.health.v1.HealthCheckRequest; +import io.grpc.health.v1.HealthCheckResponse; +import io.grpc.health.v1.HealthCheckResponse.ServingStatus; + +import static io.grpc.health.v1.HealthCheckResponse.newBuilder; + public class DemoServiceImpl implements DemoService { @Override @@ -26,10 +34,20 @@ public class DemoServiceImpl implements DemoService { } @Override - public String postTest(String name, int age) { + public String argTest(String name, int age) { return name + " is " + age + " years old"; } + @Override + public Book beanArgTest(Book book, Integer quote) { + if (book == null) { + book = new Book(); + } else if (quote != null) { + book.setPrice(quote); + } + return book; + } + @Override public Book buy(Book book) { return book; @@ -58,4 +76,22 @@ public class DemoServiceImpl implements DemoService { public String noInterfaceAndMapping() { return "ok"; } + + @Override + public String argNameTest(String name1) { + return name1; + } + + @Override + public void pbServerStream(HealthCheckRequest request, StreamObserver responseObserver) { + String service = request.getService(); + if (StringUtils.isNotEmpty(service)) { + int count = Integer.parseInt(service); + for (int i = 0; i < count; i++) { + responseObserver.onNext( + newBuilder().setStatus(ServingStatus.SERVING).build()); + } + } + responseObserver.onCompleted(); + } } diff --git a/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/test/TestRunner.java b/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/test/TestRunner.java index 6678c81c04..47168026bf 100644 --- a/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/test/TestRunner.java +++ b/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/test/TestRunner.java @@ -16,6 +16,8 @@ */ package org.apache.dubbo.rpc.protocol.tri.test; +import java.util.List; + public interface TestRunner { TestResponse run(TestRequest request); @@ -28,16 +30,24 @@ public interface TestRunner { T get(String path, Class type); + List gets(String path, Class type); + String get(String path); + List gets(String path); + T post(TestRequest request, Class type); String post(TestRequest request); T post(String path, Object body, Class type); + List posts(String path, Object body, Class type); + String post(String path, Object body); + List posts(String path, Object body); + T put(TestRequest request, Class type); String put(TestRequest request); diff --git a/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/test/TestRunnerImpl.java b/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/test/TestRunnerImpl.java index 4d3a424243..d55f948539 100644 --- a/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/test/TestRunnerImpl.java +++ b/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/test/TestRunnerImpl.java @@ -217,11 +217,21 @@ final class TestRunnerImpl implements TestRunner { return get(new TestRequest(path), type); } + @Override + public List gets(String path, Class type) { + return run(new TestRequest(path).setMethod(HttpMethods.GET.name())).getBodies(type); + } + @Override public String get(String path) { return get(new TestRequest(path)); } + @Override + public List gets(String path) { + return gets(path, String.class); + } + @Override public T post(TestRequest request, Class type) { return run(request.setMethod(HttpMethods.POST.name()), type); @@ -237,11 +247,22 @@ final class TestRunnerImpl implements TestRunner { return post(new TestRequest(path).setBody(body), type); } + @Override + public List posts(String path, Object body, Class type) { + return run(new TestRequest(path).setMethod(HttpMethods.POST.name()).setBody(body)) + .getBodies(type); + } + @Override public String post(String path, Object body) { return post(new TestRequest(path).setBody(body)); } + @Override + public List posts(String path, Object body) { + return posts(path, body, String.class); + } + @Override public T put(TestRequest request, Class type) { return run(request.setMethod(HttpMethods.PUT.name()), type);