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

albumenj pushed a commit to branch 3.3
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/3.3 by this push:
     new bf4f0c0698 A couple of rest bugfix (#14822)
bf4f0c0698 is described below

commit bf4f0c0698acbb6ac9efd0566e82621d9c2e8c3f
Author: Sean Yang <[email protected]>
AuthorDate: Mon Oct 28 15:11:16 2024 +0800

    A couple of rest bugfix (#14822)
---
 .../tri/rest/support/jaxrs/HeaderParamArgumentResolver.java  |  2 +-
 .../rest/support/spring/RequestHeaderArgumentResolver.java   |  2 +-
 .../rpc/protocol/tri/h12/HttpContextCallbackFilter.java      |  2 +-
 .../dubbo/rpc/protocol/tri/rest/RestHttpMessageCodec.java    | 12 ++++++++++++
 .../protocol/tri/rest/mapping/RestRequestHandlerMapping.java |  5 +++++
 .../tri/rest/support/basic/ParamArgumentResolver.java        |  2 +-
 6 files changed, 21 insertions(+), 4 deletions(-)

diff --git 
a/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/HeaderParamArgumentResolver.java
 
b/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/HeaderParamArgumentResolver.java
index 8989c0ab06..63a71b9435 100644
--- 
a/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/HeaderParamArgumentResolver.java
+++ 
b/dubbo-plugin/dubbo-rest-jaxrs/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/jaxrs/HeaderParamArgumentResolver.java
@@ -43,6 +43,6 @@ public class HeaderParamArgumentResolver extends 
AbstractJaxrsArgumentResolver {
 
     @Override
     protected Object resolveMapValue(NamedValueMeta meta, HttpRequest request, 
HttpResponse response) {
-        return request.headers();
+        return request.headers().asMap();
     }
 }
diff --git 
a/dubbo-plugin/dubbo-rest-spring/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/spring/RequestHeaderArgumentResolver.java
 
b/dubbo-plugin/dubbo-rest-spring/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/spring/RequestHeaderArgumentResolver.java
index df554d8eff..acf7e40723 100644
--- 
a/dubbo-plugin/dubbo-rest-spring/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/spring/RequestHeaderArgumentResolver.java
+++ 
b/dubbo-plugin/dubbo-rest-spring/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/spring/RequestHeaderArgumentResolver.java
@@ -43,6 +43,6 @@ public final class RequestHeaderArgumentResolver extends 
AbstractSpringArgumentR
 
     @Override
     protected Object resolveMapValue(NamedValueMeta meta, HttpRequest request, 
HttpResponse response) {
-        return request.headers();
+        return request.headers().asMap();
     }
 }
diff --git 
a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/h12/HttpContextCallbackFilter.java
 
b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/h12/HttpContextCallbackFilter.java
index 902da71c49..fa48294895 100644
--- 
a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/h12/HttpContextCallbackFilter.java
+++ 
b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/h12/HttpContextCallbackFilter.java
@@ -29,7 +29,7 @@ import org.apache.dubbo.rpc.Result;
 import org.apache.dubbo.rpc.RpcException;
 import org.apache.dubbo.rpc.protocol.tri.TripleConstants;
 
-@Activate(group = CommonConstants.PROVIDER, order = 29000)
+@Activate(group = CommonConstants.PROVIDER, order = 10)
 public class HttpContextCallbackFilter implements Filter, BaseFilter.Listener {
 
     @Override
diff --git 
a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/RestHttpMessageCodec.java
 
b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/RestHttpMessageCodec.java
index 13cc0bd615..653794d4b9 100644
--- 
a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/RestHttpMessageCodec.java
+++ 
b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/RestHttpMessageCodec.java
@@ -26,6 +26,7 @@ import 
org.apache.dubbo.remoting.http12.message.HttpMessageDecoder;
 import org.apache.dubbo.remoting.http12.message.HttpMessageEncoder;
 import org.apache.dubbo.remoting.http12.message.MediaType;
 import org.apache.dubbo.rpc.protocol.tri.rest.argument.ArgumentResolver;
+import org.apache.dubbo.rpc.protocol.tri.rest.argument.TypeConverter;
 import org.apache.dubbo.rpc.protocol.tri.rest.mapping.meta.ParameterMeta;
 
 import java.io.ByteArrayInputStream;
@@ -34,6 +35,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.nio.charset.Charset;
+import java.util.Optional;
 
 public final class RestHttpMessageCodec implements HttpMessageDecoder, 
HttpMessageEncoder {
 
@@ -43,6 +45,7 @@ public final class RestHttpMessageCodec implements 
HttpMessageDecoder, HttpMessa
     private final HttpResponse response;
     private final ParameterMeta[] parameters;
     private final ArgumentResolver argumentResolver;
+    private final TypeConverter typeConverter;
     private final HttpMessageEncoder messageEncoder;
     private final Charset charset;
 
@@ -51,11 +54,13 @@ public final class RestHttpMessageCodec implements 
HttpMessageDecoder, HttpMessa
             HttpResponse response,
             ParameterMeta[] parameters,
             ArgumentResolver argumentResolver,
+            TypeConverter typeConverter,
             HttpMessageEncoder messageEncoder) {
         this.request = request;
         this.response = response;
         this.parameters = parameters;
         this.argumentResolver = argumentResolver;
+        this.typeConverter = typeConverter;
         this.messageEncoder = messageEncoder;
         charset = request.charsetOrDefault();
     }
@@ -106,6 +111,10 @@ public final class RestHttpMessageCodec implements 
HttpMessageDecoder, HttpMessa
     public void encode(OutputStream os, Object data) throws EncodeException {
         if (data != null) {
             Class<?> type = data.getClass();
+            if (type == Optional.class) {
+                encode(os, ((Optional<?>) data).orElse(null));
+                return;
+            }
             try {
                 if (type == byte[].class) {
                     os.write((byte[]) data);
@@ -121,6 +130,9 @@ public final class RestHttpMessageCodec implements 
HttpMessageDecoder, HttpMessa
                     }
                     return;
                 }
+                if (messageEncoder.mediaType().isPureText() && type != 
String.class) {
+                    data = typeConverter.convert(data, String.class);
+                }
             } catch (HttpStatusException e) {
                 throw e;
             } catch (Exception e) {
diff --git 
a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/RestRequestHandlerMapping.java
 
b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/RestRequestHandlerMapping.java
index faf9ed6113..2057d8e398 100644
--- 
a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/RestRequestHandlerMapping.java
+++ 
b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/RestRequestHandlerMapping.java
@@ -36,6 +36,8 @@ import org.apache.dubbo.rpc.protocol.tri.rest.RestConstants;
 import org.apache.dubbo.rpc.protocol.tri.rest.RestHttpMessageCodec;
 import org.apache.dubbo.rpc.protocol.tri.rest.argument.ArgumentResolver;
 import 
org.apache.dubbo.rpc.protocol.tri.rest.argument.CompositeArgumentResolver;
+import org.apache.dubbo.rpc.protocol.tri.rest.argument.GeneralTypeConverter;
+import org.apache.dubbo.rpc.protocol.tri.rest.argument.TypeConverter;
 import 
org.apache.dubbo.rpc.protocol.tri.rest.mapping.condition.MethodsCondition;
 import org.apache.dubbo.rpc.protocol.tri.rest.mapping.meta.HandlerMeta;
 import org.apache.dubbo.rpc.protocol.tri.rest.util.RequestUtils;
@@ -51,6 +53,7 @@ public final class RestRequestHandlerMapping implements 
RequestHandlerMapping {
 
     private final RequestMappingRegistry requestMappingRegistry;
     private final ArgumentResolver argumentResolver;
+    private final TypeConverter typeConverter;
     private final ContentNegotiator contentNegotiator;
     private final CodecUtils codecUtils;
 
@@ -58,6 +61,7 @@ public final class RestRequestHandlerMapping implements 
RequestHandlerMapping {
         ScopeBeanFactory beanFactory = frameworkModel.getBeanFactory();
         requestMappingRegistry = 
beanFactory.getOrRegisterBean(DefaultRequestMappingRegistry.class);
         argumentResolver = 
beanFactory.getOrRegisterBean(CompositeArgumentResolver.class);
+        typeConverter = 
beanFactory.getOrRegisterBean(GeneralTypeConverter.class);
         contentNegotiator = 
beanFactory.getOrRegisterBean(ContentNegotiator.class);
         codecUtils = beanFactory.getOrRegisterBean(CodecUtils.class);
     }
@@ -98,6 +102,7 @@ public final class RestRequestHandlerMapping implements 
RequestHandlerMapping {
                 response,
                 meta.getParameters(),
                 argumentResolver,
+                typeConverter,
                 codecUtils.determineHttpMessageEncoder(url, 
responseMediaType));
 
         if (HttpMethods.supportBody(method) && 
!RequestUtils.isFormOrMultiPart(request)) {
diff --git 
a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/basic/ParamArgumentResolver.java
 
b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/basic/ParamArgumentResolver.java
index 14e55e186b..cbf906408d 100644
--- 
a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/basic/ParamArgumentResolver.java
+++ 
b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/support/basic/ParamArgumentResolver.java
@@ -151,7 +151,7 @@ public class ParamArgumentResolver extends 
AbstractAnnotationBaseArgumentResolve
             case Param:
                 return RequestUtils.getParametersMap(request);
             case Header:
-                return request.headers();
+                return request.headers().asMap();
             case Cookie:
                 Collection<HttpCookie> cookies = request.cookies();
                 if (cookies.isEmpty()) {

Reply via email to