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

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


The following commit(s) were added to refs/heads/3.2 by this push:
     new 5cd5b32b8b Feature/3.2 beta7 rest formdata fix (#12040)
5cd5b32b8b is described below

commit 5cd5b32b8ba74f27411aeecc4ae95f3963794d86
Author: suncairong163 <[email protected]>
AuthorDate: Mon Apr 10 07:34:02 2023 +0800

    Feature/3.2 beta7 rest formdata fix (#12040)
    
    * Fix conflict
    
    * Fix header
    
    * fix import
    
    * fix import
    
    * fix import
    
    * fix import
    
    * fix import
    
    * Fix json
    
    * revert some change
    
    * Remove jsonfactory
    
    * Remove jsonfactory
    
    * Simplify rest client
    
    * Fix protocol
    
    * fix codec
    
    * tmp disable test
    
    * rest metadata resolver add  interface judge
    
    * add rest metadata  resolve unit test & fix  
AbstractServiceRestMetadataResolver
    
    * org.apache.dubbo.metadata.rest.ParamType null exclude & add default 
accept header
    
    * RestProtocolTest
    
    refer add context path
    unit test
    
    * some fix
    
    * ADD TODO
    
    * RESOLVE HTTP client java.net.SocketException: socket closed
    
    * RESOLVE HTTP client java.net.SocketException: socket closed
    
    * add spring mvc rest protocol unit test
    
    * rest protocol http response code deal
    
    * rest protocol http response message
    
    * fix some review advice
    
    * fix some review advice
    
    * add rest metadata  resolve unit test & fix  
AbstractServiceRestMetadataResolver
    
    * org.apache.dubbo.metadata.rest.ParamType null exclude & add default 
accept header
    
    * RestProtocolTest
    
    refer add context path
    unit test
    
    * some fix
    
    * fix some review advice
    
    * add spring mvc rest protocol unit test
    
    * rest protocol http response code deal
    
    * rest protocol http response message
    
    * URLConnectionRestClient getMessage
    
    * remove unused import
    
    * import fix
    
    * code merge
    
    * remove unused import
    
    * code merge
    
    * code merge
    
    * some fix
    
    * code merge
    
    * code merge
    
    * code merge
    
    * code merge
    
    * Rest http server
    
    * rest protocol do export
    
    * code merge
    
    * rest protocol provider
    
    * rest protocol provider
    
    * rest protocol  response
    
    * rest protocol  netty request
    
    * Fix conflicts
    
    * change  restResult InputStream to bytes protect from  fd leak
    
    * merge code
    
    * Fix import
    
    * Fix import
    
    * Fix uts
    
    * Remove unused code
    
    * Fix logger
    
    * Update okhttp version
    
    * Update okhttp version
    
    * rest protocol  add AnotherUserRestService service ut
    
    * rest protocol  add String & byteArray codec
    
    * Fix version
    
    * Fix uts
    
    * rest protocol  add XMLCodec
    
    * stream release
    
    * ServiceRestMetadata port change int to Integer
    
    * service RestMetadata service map init
    
    * xml codec change  for xxe
    
    * Fix import
    
    * code style
    
    * code style
    
    * Fix shade
    
    * change for rest client recreate & destroy bugs
    
    * remove recreate double check for code merge
    
    * rest client destroy check
    
    * add todo
    
    * consumer merge code
    
    * rest response
    
    * BodyProviderParamParser bytes
    
    * merge upstream 3.2 to 3.2_consumer_proxy_invocation_handler
    
    * merge upstream 3.2 to feature/3.2-rest_protocol_provider
    
    * fix rest provider ut
    
    * path compare
    
    * path compare
    
    * fix provider  rest ut
    
    * fix provider  rest ut
    
    * fix provider  rest ut
    
    * testJaxrsPathPattern ut
    
    * JAXRSServiceRestMetadataResolverTest  ut
    
    * JAXRSServiceRestMetadataResolverTest  ut
    
    * add netty http server
    
    * add netty http server response encode
    
    * rest netty  http server  codec
    
    * rest netty  http server  codec
    
    * some fix  netty http server
    
    * add spring mvc ut  for netty http server
    
    * okhttp_version to 3.14.2 to resolve dependency conflict
    
    * Fix license
    
    * add rest protocol exception mapper
    
    * add TODO ExceptionMapper should be static or instance
    
    * add TODO OKHttpRestClient implements of version >=4.0
    
    * fix licence format
    
    * fix ut
    
    * fix testPathMatcher
    
    * url context path
    
    * format context path from url
    
    * fix illegal logger method invocations:
    
    * remove org.jetbrains.annotations.NotNull
    
    * add Newly created SPI interface  to dubbo-all
    
    * some  format
    
    * merge 3.2
    
    * merge 3.2
    
    * merge 3.2
    
    * Revert "merge 3.2"
    
    This reverts commit ad19804437f22d422578572b8f8fbc8b63b68b09.
    
    * merge upstream 3.2
    
    * change HttpHandler throws   IOException
    
    * deal with  RPCInvocation build error
    
    * request is present
    
    * remove  request facade unused code
    
    * remove   thirdpart web  server code
    
    * remove   thirdpart web  server code
    
    * remove   unused imports
    
    * remove   unused code
    
    * rest protocol directly implement AbstractProtocol
    
    * code style
    
    * change method  modifier
    
    * form body  java bean convert
    
    * change header name  to RestHeaderEnum
    
    * attachment header
    
    * http handler error info
    
    * rest header distinguish from attachment
    
    * some log & double path check
    
    * remove RestMethodMetadata ServiceRestMetadata refer
    
    * reconstruct http handler
    
    * content-type judge
    
    * add RestInvoker
    
    * setTargetServiceUniqueName
    
    * path mapper & http handler
    
    * remove unused code
    
    * netty thread pool
    
    * RestHttpRequestDecoder @ChannelHandler.Sharable
    
    * add rest client ut
    
    * fix metadata resolver test
    
    * fix metadata resolver test
    
    * add some description to code
    
    * add error test
    
    * error message append
    
    * add request address
    
    * request address
    
    * http netty server reconstruct
    
    * http netty server TODO add SslServerTlsHandler
    
    * replace all pair use
    
    * pair fix
    
    * add NumberUtils ut
    
    * add hex number  ut
    
    * add no annotation primitive ut
    
    * remove unsed code
    
    * throw exception
    
    * add ut
    
    * rename constants & remove unused code
    
    * add ut
    
    * add ut
    
    * add ut
    
    * add ut
    
    * remove ut
    
    * add restClient ut
    
    * add restClient ut
    
    * add DataParseUtils ut
    
    * add path matcher ut
    
    * add request template ut
    
    * add request template ut
    
    * fix xml codec
    
    * some fix
    
    * Class to Class<?>
    
    * media type judge fix and add codec ut
    
    * remove print
    
    * add header map param ut
    
    * add header map param null ut
    
    * MediaTypeUtil ut
    
    * add param & header & multimap     ut
    
    * remove unused import
    
    * fix error log format
    
    * test header param
    
    * test header number  param
    
    * add MediaType ut
    
    * add MediaType & metadata resolve ut
    
    * imports
    
    * add netty request facade ut
    
    * some  format
    
    * add ExceptionMapperTest
    
    * add hasExceptionMapper pre judge
    
    * fix exception mapper throws
    
    * change  static ExceptionMapper to instance
    
    * resolve Java_Zulu_jdk/17.0.6-10/x64 param is not throwable , exception
    mapper ut
    
    * fix reflects util some detail
    
    * remove unused code
    
    * add null arg ut
    
    * rest invoker response future complete Exceptionally
    
    * fix http netty server executor
    
    * set rpc context request & response
    
    * add rest token attachment
    
    * add http method ut
    
    * remove unused code
    
    * some fix
    
    * remove keep-alive header
    
    * remove unused code
    
    * close channel
    
    * add response connection:close head
    
    * fix no content-type
    
    * fix no content-type form
    
    ---------
    
    Co-authored-by: Albumen Kevin <[email protected]>
    Co-authored-by: suncr <[email protected]>
---
 .../main/java/org/apache/dubbo/metadata/rest/ParamType.java    |  4 ++++
 .../param/parse/consumer/FormConsumerParamParser.java          |  9 +++++++++
 .../param/parse/consumer/HeaderConsumerParamParser.java        |  2 +-
 .../param/parse/consumer/ParameterConsumerParamParser.java     |  2 +-
 .../param/parse/provider/BodyProviderParamParser.java          |  2 +-
 .../dubbo/rpc/protocol/rest/handler/NettyHttpHandler.java      | 10 +++++-----
 .../rpc/protocol/rest/message/HttpMessageCodecManager.java     |  4 ++++
 .../dubbo/rpc/protocol/rest/message/codec/JsonCodec.java       |  1 +
 .../dubbo/rpc/protocol/rest/message/codec/StringCodec.java     |  3 +++
 .../java/org/apache/dubbo/rpc/protocol/rest/DemoService.java   |  2 --
 .../org/apache/dubbo/rpc/protocol/rest/DemoServiceImpl.java    |  5 -----
 11 files changed, 29 insertions(+), 15 deletions(-)

diff --git 
a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/ParamType.java
 
b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/ParamType.java
index 43902cfd6e..457da7ebd4 100644
--- 
a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/ParamType.java
+++ 
b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/ParamType.java
@@ -39,6 +39,10 @@ public enum ParamType {
     FORM(addSupportTypes(JAXRSClassConstants.FORM_PARAM_ANNOTATION_CLASS,
         SpringMvcClassConstants.REQUEST_BODY_ANNOTATION_CLASS)),
 
+    PROVIDER_BODY(addSupportTypes(
+        
JAXRSClassConstants.REST_EASY_BODY_ANNOTATION_CLASS,JAXRSClassConstants.FORM_PARAM_ANNOTATION_CLASS,
+        SpringMvcClassConstants.REQUEST_BODY_ANNOTATION_CLASS, BodyTag.class)),
+
     EMPTY(addSupportTypes());
     private List<Class> annotationClasses;
 
diff --git 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/annotation/param/parse/consumer/FormConsumerParamParser.java
 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/annotation/param/parse/consumer/FormConsumerParamParser.java
index 6ecd7c2f16..2b2e04f1ba 100644
--- 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/annotation/param/parse/consumer/FormConsumerParamParser.java
+++ 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/annotation/param/parse/consumer/FormConsumerParamParser.java
@@ -17,13 +17,17 @@
 package org.apache.dubbo.rpc.protocol.rest.annotation.param.parse.consumer;
 
 import org.apache.dubbo.common.extension.Activate;
+import org.apache.dubbo.common.utils.CollectionUtils;
 import org.apache.dubbo.common.utils.ReflectUtils;
 import org.apache.dubbo.metadata.rest.ArgInfo;
 import org.apache.dubbo.metadata.rest.ParamType;
+import org.apache.dubbo.metadata.rest.media.MediaType;
 import org.apache.dubbo.remoting.http.RequestTemplate;
+import org.apache.dubbo.rpc.protocol.rest.constans.RestConstant;
 import org.apache.dubbo.rpc.protocol.rest.util.DataParseUtils;
 
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -64,6 +68,11 @@ public class FormConsumerParamParser implements 
BaseConsumerParamParser {
             requestTemplate.body(tmp, Map.class);
         }
 
+        Collection<String> headers = 
requestTemplate.getHeaders(RestConstant.CONTENT_TYPE);
+        if (CollectionUtils.isEmpty(headers)) {
+            requestTemplate.addHeader(RestConstant.CONTENT_TYPE, 
MediaType.APPLICATION_FORM_URLENCODED_VALUE.value);
+        }
+
 
     }
 
diff --git 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/annotation/param/parse/consumer/HeaderConsumerParamParser.java
 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/annotation/param/parse/consumer/HeaderConsumerParamParser.java
index dd25756a4d..d99a01164d 100644
--- 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/annotation/param/parse/consumer/HeaderConsumerParamParser.java
+++ 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/annotation/param/parse/consumer/HeaderConsumerParamParser.java
@@ -47,7 +47,7 @@ public class HeaderConsumerParamParser implements 
BaseConsumerParamParser {
             }
         } else {
             // others
-            requestTemplate.addHeader(argInfo.getParamName(), headerValue);
+            requestTemplate.addHeader(argInfo.getAnnotationNameAttribute(), 
headerValue);
 
         }
 
diff --git 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/annotation/param/parse/consumer/ParameterConsumerParamParser.java
 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/annotation/param/parse/consumer/ParameterConsumerParamParser.java
index 23e85ef239..11509a7965 100644
--- 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/annotation/param/parse/consumer/ParameterConsumerParamParser.java
+++ 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/annotation/param/parse/consumer/ParameterConsumerParamParser.java
@@ -45,7 +45,7 @@ public class ParameterConsumerParamParser implements 
BaseConsumerParamParser {
                 requestTemplate.addParam(String.valueOf(name), 
paramValues.get(name));
             }
         } else {
-            requestTemplate.addParam(argInfo.getParamName(), paramValue);
+            requestTemplate.addParam(argInfo.getAnnotationNameAttribute(), 
paramValue);
 
 
         }
diff --git 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/annotation/param/parse/provider/BodyProviderParamParser.java
 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/annotation/param/parse/provider/BodyProviderParamParser.java
index ad3fadfae9..294de98fcb 100644
--- 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/annotation/param/parse/provider/BodyProviderParamParser.java
+++ 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/annotation/param/parse/provider/BodyProviderParamParser.java
@@ -52,6 +52,6 @@ public class BodyProviderParamParser extends 
ProviderParamParser {
 
     @Override
     protected ParamType getParamType() {
-        return ParamType.BODY;
+        return ParamType.PROVIDER_BODY;
     }
 }
diff --git 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/handler/NettyHttpHandler.java
 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/handler/NettyHttpHandler.java
index 2bf21d8261..a3243685ab 100644
--- 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/handler/NettyHttpHandler.java
+++ 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/handler/NettyHttpHandler.java
@@ -68,7 +68,7 @@ public class NettyHttpHandler implements 
HttpHandler<NettyRequestFacade, NettyHt
         
RpcContext.getServiceContext().setLocalAddress(requestFacade.getLocalAddr(), 
requestFacade.getLocalPort());
 
         // set request
-        RpcContext.getServiceContext().setRequest(requestFacade.getRequest());
+        RpcContext.getServiceContext().setRequest(requestFacade);
 
         // set response
         RpcContext.getServiceContext().setResponse(nettyHttpResponse);
@@ -149,7 +149,7 @@ public class NettyHttpHandler implements 
HttpHandler<NettyRequestFacade, NettyHt
      * @throws Exception
      */
     private void writeResult(NettyHttpResponse nettyHttpResponse, 
RequestFacade request, Invoker invoker, Object value, Class returnType) throws 
Exception {
-        MediaType mediaType = getAcceptMediaType(request);
+        MediaType mediaType = getAcceptMediaType(request,returnType);
 
         MessageCodecResultPair booleanMediaTypePair = 
HttpMessageCodecManager.httpMessageEncode(nettyHttpResponse.getOutputStream(), 
value, invoker.getUrl(), mediaType, returnType);
 
@@ -162,9 +162,9 @@ public class NettyHttpHandler implements 
HttpHandler<NettyRequestFacade, NettyHt
      * @param request
      * @return
      */
-    private MediaType getAcceptMediaType(RequestFacade request) {
+    private MediaType getAcceptMediaType(RequestFacade request,Class<?> 
returnType) {
         String accept = request.getHeader(RestHeaderEnum.ACCEPT.getHeader());
-        MediaType mediaType = MediaTypeUtil.convertMediaType(null, accept);
+        MediaType mediaType = MediaTypeUtil.convertMediaType(returnType, 
accept);
         return mediaType;
     }
 
@@ -176,7 +176,7 @@ public class NettyHttpHandler implements 
HttpHandler<NettyRequestFacade, NettyHt
     private void acceptSupportJudge(RequestFacade requestFacade, Class<?> 
returnType) {
         try {
             // media type judge
-            getAcceptMediaType(requestFacade);
+            getAcceptMediaType(requestFacade,returnType);
         } catch (UnSupportContentTypeException e) {
             // return type judge
             MediaType mediaType = 
HttpMessageCodecManager.typeSupport(returnType);
diff --git 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/HttpMessageCodecManager.java
 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/HttpMessageCodecManager.java
index 9393f0969a..27b6ef57e7 100644
--- 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/HttpMessageCodecManager.java
+++ 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/HttpMessageCodecManager.java
@@ -31,6 +31,10 @@ public class HttpMessageCodecManager {
 
 
     public static Object httpMessageDecode(byte[] body, Class<?> type, 
MediaType mediaType) throws Exception {
+        if (body == null || body.length == 0) {
+            return null;
+        }
+
         for (HttpMessageCodec httpMessageCodec : httpMessageCodecs) {
             if (httpMessageCodec.contentTypeSupport(mediaType, type) || 
typeJudge(mediaType, type, httpMessageCodec)) {
                 return httpMessageCodec.decode(body, type);
diff --git 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/JsonCodec.java
 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/JsonCodec.java
index a134ec01c7..f5e82ce49a 100644
--- 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/JsonCodec.java
+++ 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/JsonCodec.java
@@ -39,6 +39,7 @@ public class JsonCodec implements HttpMessageCodec<byte[], 
OutputStream> {
     static {
 
         unSupportClasses.add(byte[].class);
+        unSupportClasses.add(String.class);
 
     }
 
diff --git 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/StringCodec.java
 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/StringCodec.java
index 6324b3325f..d30b2e5a11 100644
--- 
a/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/StringCodec.java
+++ 
b/dubbo-rpc/dubbo-rpc-rest/src/main/java/org/apache/dubbo/rpc/protocol/rest/message/codec/StringCodec.java
@@ -33,6 +33,9 @@ public class StringCodec implements HttpMessageCodec<byte[], 
OutputStream> {
 
     @Override
     public Object decode(byte[] body, Class<?> targetType) throws Exception {
+        if (body == null || body.length == 0) {
+            return null;
+        }
         return new String(body);
     }
 
diff --git 
a/dubbo-rpc/dubbo-rpc-rest/src/test/java/org/apache/dubbo/rpc/protocol/rest/DemoService.java
 
b/dubbo-rpc/dubbo-rpc-rest/src/test/java/org/apache/dubbo/rpc/protocol/rest/DemoService.java
index 980355844e..85e61837d8 100644
--- 
a/dubbo-rpc/dubbo-rpc-rest/src/test/java/org/apache/dubbo/rpc/protocol/rest/DemoService.java
+++ 
b/dubbo-rpc/dubbo-rpc-rest/src/test/java/org/apache/dubbo/rpc/protocol/rest/DemoService.java
@@ -51,8 +51,6 @@ public interface DemoService {
 
     @POST
     @Path("number")
-    @Produces({MediaType.TEXT_PLAIN})
-    @Consumes({MediaType.APPLICATION_FORM_URLENCODED})
     Long testFormBody(@FormParam("number") Long number);
 
     boolean isCalled();
diff --git 
a/dubbo-rpc/dubbo-rpc-rest/src/test/java/org/apache/dubbo/rpc/protocol/rest/DemoServiceImpl.java
 
b/dubbo-rpc/dubbo-rpc-rest/src/test/java/org/apache/dubbo/rpc/protocol/rest/DemoServiceImpl.java
index 7a908d93ad..f5e7c2369a 100644
--- 
a/dubbo-rpc/dubbo-rpc-rest/src/test/java/org/apache/dubbo/rpc/protocol/rest/DemoServiceImpl.java
+++ 
b/dubbo-rpc/dubbo-rpc-rest/src/test/java/org/apache/dubbo/rpc/protocol/rest/DemoServiceImpl.java
@@ -24,7 +24,6 @@ import javax.ws.rs.Consumes;
 import javax.ws.rs.GET;
 import javax.ws.rs.POST;
 import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.HeaderParam;
 import javax.ws.rs.core.MediaType;
@@ -46,10 +45,6 @@ public class DemoServiceImpl implements DemoService {
         return "Hello, " + name;
     }
 
-    @POST
-    @Path("number")
-    @Produces({javax.ws.rs.core.MediaType.APPLICATION_FORM_URLENCODED})
-    @Consumes({MediaType.APPLICATION_FORM_URLENCODED})
     @Override
     public Long testFormBody(Long number) {
         return number;

Reply via email to