[SCB-2509] Bump vertx version from 4.2.7 to 4.3.2 (#3244)

diff --git a/dependencies/default/pom.xml b/dependencies/default/pom.xml
index 65de9bf..4c684c2 100644
--- a/dependencies/default/pom.xml
+++ b/dependencies/default/pom.xml
@@ -97,7 +97,7 @@
     <spring-boot.version>2.6.7</spring-boot.version>
     <swagger.version>1.6.6</swagger.version>
     <swagger2markup.version>1.3.3</swagger2markup.version>
-    <vertx.version>4.2.7</vertx.version>
+    <vertx.version>4.3.2</vertx.version>
     <zipkin.version>2.23.18</zipkin.version>
     <zipkin-reporter.version>2.16.3</zipkin-reporter.version>
     <!-- Base dir of main -->
diff --git a/edge/edge-core/src/main/java/org/apache/servicecomb/edge/core/URLMappedEdgeDispatcher.java b/edge/edge-core/src/main/java/org/apache/servicecomb/edge/core/URLMappedEdgeDispatcher.java
index 014c1e9..3cff759 100644
--- a/edge/edge-core/src/main/java/org/apache/servicecomb/edge/core/URLMappedEdgeDispatcher.java
+++ b/edge/edge-core/src/main/java/org/apache/servicecomb/edge/core/URLMappedEdgeDispatcher.java
@@ -20,6 +20,7 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import io.vertx.ext.web.handler.PlatformHandler;
 import org.apache.servicecomb.transport.rest.vertx.RestBodyHandler;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -71,7 +72,7 @@
     // cookies handler are enabled by default start from 3.8.3
     String pattern = DynamicPropertyFactory.getInstance().getStringProperty(KEY_PATTERN, PATTERN_ANY).get();
     router.routeWithRegex(pattern).failureHandler(this::onFailure)
-        .handler(this::preCheck)
+        .handler((PlatformHandler) URLMappedEdgeDispatcher.this::preCheck)
         .handler(createBodyHandler())
         .handler(this::onRequest);
   }
diff --git a/foundations/foundation-test-scaffolding/src/main/java/io/vertx/core/impl/SyncContext.java b/foundations/foundation-test-scaffolding/src/main/java/io/vertx/core/impl/SyncContext.java
index 31cc2d9..eb25a08 100644
--- a/foundations/foundation-test-scaffolding/src/main/java/io/vertx/core/impl/SyncContext.java
+++ b/foundations/foundation-test-scaffolding/src/main/java/io/vertx/core/impl/SyncContext.java
@@ -29,7 +29,7 @@
   }
 
   public SyncContext(VertxInternal vertx) {
-    super(vertx, null, null, null, null, null, null, false);
+    super(vertx, null, null, null, null, null, null);
   }
 
   @Override
@@ -42,7 +42,7 @@
   }
 
   @Override
-  public void runOnContext(AbstractContext ctx, Handler<Void> action) {
+  protected void runOnContext(ContextInternal ctx, Handler<Void> action) {
     action.handle(null);
   }
 
diff --git a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/http/VertxServerRequestToHttpServletRequest.java b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/http/VertxServerRequestToHttpServletRequest.java
index e0e72b0..435b660 100644
--- a/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/http/VertxServerRequestToHttpServletRequest.java
+++ b/foundations/foundation-vertx/src/main/java/org/apache/servicecomb/foundation/vertx/http/VertxServerRequestToHttpServletRequest.java
@@ -33,6 +33,7 @@
 import javax.servlet.http.Part;
 import javax.ws.rs.core.HttpHeaders;
 
+import io.vertx.ext.web.impl.RoutingContextInternal;
 import org.apache.servicecomb.foundation.common.http.HttpUtils;
 import org.apache.servicecomb.foundation.vertx.stream.BufferInputStream;
 import org.slf4j.Logger;
@@ -77,13 +78,16 @@
     this.context = context;
     this.vertxRequest = context.request();
     this.socketAddress = this.vertxRequest.remoteAddress();
-    super.setBodyBuffer(context.getBody());
+    super.setBodyBuffer(context.body().buffer());
   }
 
   @Override
   public void setBodyBuffer(Buffer bodyBuffer) {
     super.setBodyBuffer(bodyBuffer);
-    context.setBody(bodyBuffer);
+    if (context instanceof RoutingContextInternal) {
+      RoutingContextInternal contextInternal = (RoutingContextInternal) context;
+      contextInternal.setBody(bodyBuffer);
+    }
     this.inputStream = null;
   }
 
@@ -143,8 +147,7 @@
       Map<String, String[]> paramMap = new HashMap<>();
       MultiMap map = this.vertxRequest.params();
       for (String name : map.names()) {
-        List<String> valueList = map.getAll(name);
-        paramMap.put(name, map.getAll(name).toArray(new String[valueList.size()]));
+        paramMap.put(name, map.getAll(name).toArray(new String[0]));
       }
       parameterMap = paramMap;
     }
@@ -255,10 +258,10 @@
     if (inputStream != null) {
       return inputStream;
     }
-    if (context.getBody() == null) {
+    if (context.body().buffer() == null) {
       return null;
     }
-    inputStream = new BufferInputStream(context.getBody().getByteBuf());
+    inputStream = new BufferInputStream(context.body().buffer().getByteBuf());
     return inputStream;
   }
 
@@ -284,8 +287,7 @@
 
   @Override
   public Collection<Part> getParts() {
-    Set<FileUpload> fileUploads = context.fileUploads();
-    return fileUploads.stream().map(FileUploadPart::new).collect(Collectors.toList());
+    return context.fileUploads().stream().map(FileUploadPart::new).collect(Collectors.toList());
   }
 
   public RoutingContext getContext() {
diff --git a/foundations/foundation-vertx/src/test/java/io/vertx/ext/web/impl/TestHttpServerRequestUtils.java b/foundations/foundation-vertx/src/test/java/io/vertx/ext/web/impl/TestHttpServerRequestUtils.java
index 874226f..ec8255f 100644
--- a/foundations/foundation-vertx/src/test/java/io/vertx/ext/web/impl/TestHttpServerRequestUtils.java
+++ b/foundations/foundation-vertx/src/test/java/io/vertx/ext/web/impl/TestHttpServerRequestUtils.java
@@ -17,6 +17,7 @@
 
 package io.vertx.ext.web.impl;
 
+import io.vertx.ext.web.RequestBody;
 import org.apache.servicecomb.foundation.vertx.http.VertxServerRequestToHttpServletRequest;
 
 import io.vertx.core.http.impl.HttpServerRequestInternal;
@@ -35,6 +36,8 @@
     HttpServerRequestWrapper wrapper = new HttpServerRequestWrapper(request, AllowForwardHeaders.NONE);
     Mockito.when(request.scheme()).thenReturn("http");
     Mockito.when(context.request()).thenReturn(wrapper);
+    RequestBody requestBody = Mockito.mock(RequestBody.class);
+    Mockito.when(context.body()).thenReturn(requestBody);
 
     VertxServerRequestToHttpServletRequest reqEx = new VertxServerRequestToHttpServletRequest(context, "abc");
     Assertions.assertEquals("abc", reqEx.getRequestURI());
diff --git a/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/http/TestVertxServerRequestToHttpServletRequest.java b/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/http/TestVertxServerRequestToHttpServletRequest.java
index 2f8785d..8479e70 100644
--- a/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/http/TestVertxServerRequestToHttpServletRequest.java
+++ b/foundations/foundation-vertx/src/test/java/org/apache/servicecomb/foundation/vertx/http/TestVertxServerRequestToHttpServletRequest.java
@@ -29,10 +29,13 @@
 import javax.servlet.http.Cookie;
 import javax.ws.rs.core.HttpHeaders;
 
+import io.vertx.ext.web.RequestBody;
+import io.vertx.ext.web.impl.RoutingContextInternal;
 import org.apache.servicecomb.foundation.common.Holder;
 import org.apache.servicecomb.foundation.common.http.HttpUtils;
 import org.hamcrest.MatcherAssert;
 import org.hamcrest.Matchers;
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -44,10 +47,9 @@
 import io.vertx.ext.web.RoutingContext;
 import mockit.Deencapsulation;
 import mockit.Expectations;
-import mockit.Mock;
-import mockit.MockUp;
 import mockit.Mocked;
 import org.junit.jupiter.api.Assertions;
+import org.mockito.Mockito;
 
 public class TestVertxServerRequestToHttpServletRequest {
   @Mocked
@@ -59,6 +61,14 @@
   @Mocked
   SocketAddress socketAddress;
 
+  RequestBody mockRequestBody;
+
+  RoutingContextInternal mockContext;
+
+  HttpServerRequest mockHttpServerRequest;
+
+  SocketAddress mockSocketAddress;
+
   VertxServerRequestToHttpServletRequest request;
 
   @Before
@@ -72,9 +82,24 @@
       }
     };
 
+    mockRequestBody = Mockito.mock(RequestBody.class);
+    mockContext = Mockito.mock(RoutingContextInternal.class);
+    mockHttpServerRequest = Mockito.mock(HttpServerRequest.class);
+    mockSocketAddress = Mockito.mock(SocketAddress.class);
+    // init mocks
+    Mockito.when(mockHttpServerRequest.remoteAddress()).thenReturn(mockSocketAddress);
+    Mockito.when(mockContext.body()).thenReturn(mockRequestBody);
+    Mockito.when(mockContext.request()).thenReturn(mockHttpServerRequest);
+
     request = new VertxServerRequestToHttpServletRequest(context);
   }
 
+  @After
+  public void clean() {
+    Mockito.reset(mockRequestBody);
+    Mockito.reset(mockContext);
+  }
+
   @Test
   public void constructWithPath() {
     request = new VertxServerRequestToHttpServletRequest(context, "/path");
@@ -85,18 +110,11 @@
   @Test
   public void setBodyBuffer() {
     Holder<Buffer> bodyHolder = new Holder<>();
-    context = new MockUp<RoutingContext>() {
-      @Mock
-      HttpServerRequest request() {
-        return vertxRequest;
-      }
-
-      @Mock
-      void setBody(Buffer body) {
-        bodyHolder.value = body;
-      }
-    }.getMockInstance();
-    request = new VertxServerRequestToHttpServletRequest(context);
+    Mockito.doAnswer(invocation -> {
+      bodyHolder.value = invocation.getArgument(0);
+      return null;
+    }).when(mockContext).setBody(Mockito.any());
+    request = new VertxServerRequestToHttpServletRequest(mockContext);
 
     Buffer bodyBuffer = Buffer.buffer();
     request.setBodyBuffer(bodyBuffer);
@@ -107,13 +125,8 @@
 
   @Test
   public void testGetContentType() {
-    new Expectations() {
-      {
-        vertxRequest.getHeader(HttpHeaders.CONTENT_TYPE);
-        result = "json";
-      }
-    };
-
+    VertxServerRequestToHttpServletRequest request = new VertxServerRequestToHttpServletRequest(mockContext);
+    Mockito.when(mockHttpServerRequest.getHeader(HttpHeaders.CONTENT_TYPE)).thenReturn("json");
     Assertions.assertEquals("json", request.getContentType());
   }
 
@@ -425,13 +438,11 @@
     Buffer body = Buffer.buffer();
     body.appendByte((byte) 1);
 
-    new Expectations() {
-      {
-        context.getBody();
-        result = body;
-      }
-    };
+    Mockito.when(mockRequestBody.buffer()).thenReturn(body);
+    Mockito.when(mockContext.request()).thenReturn(vertxRequest);
+    Mockito.when(mockContext.body()).thenReturn(mockRequestBody);
 
+    VertxServerRequestToHttpServletRequest request = new VertxServerRequestToHttpServletRequest(mockContext);
     ServletInputStream is1 = request.getInputStream();
     Assertions.assertSame(is1, request.getInputStream());
     int value = is1.read();
diff --git a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestVertxMetersInitializer.java b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestVertxMetersInitializer.java
index 564eb64..4dca3a9 100644
--- a/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestVertxMetersInitializer.java
+++ b/metrics/metrics-core/src/test/java/org/apache/servicecomb/metrics/core/TestVertxMetersInitializer.java
@@ -68,7 +68,7 @@
     @Override
     public void start(Promise<Void> startPromise) {
       Router mainRouter = Router.router(vertx);
-      mainRouter.route("/").handler(context -> context.response().end(context.getBody()));
+      mainRouter.route("/").handler(context -> context.response().end(context.body().buffer()));
 
       HttpServer server = vertx.createHttpServer();
       server.requestHandler(mainRouter);
diff --git a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/RestBodyHandler.java b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/RestBodyHandler.java
index 8a8563f..f6e02fe 100644
--- a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/RestBodyHandler.java
+++ b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/RestBodyHandler.java
@@ -22,7 +22,7 @@
 package org.apache.servicecomb.transport.rest.vertx;
 
 import java.io.File;
-import java.util.Set;
+import java.util.List;
 import java.util.UUID;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -209,7 +209,7 @@
         initBodyBuffer();
       }
 
-      Set<FileUpload> fileUploads = context.fileUploads();
+      List<FileUpload> fileUploads = context.fileUploads();
 
       final String contentType = context.request().getHeader(HttpHeaders.CONTENT_TYPE);
       if (contentType == null) {
@@ -361,7 +361,10 @@
       if (mergeFormAttributes && req.isExpectMultipart()) {
         req.params().addAll(req.formAttributes());
       }
-      context.setBody(body);
+      if (context instanceof RoutingContextInternal) {
+        RoutingContextInternal contextInternal = (RoutingContextInternal) context;
+        contextInternal.setBody(body);
+      }
       // release body as it may take lots of memory
       body = null;
 
diff --git a/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/TestVertxRestDispatcher.java b/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/TestVertxRestDispatcher.java
index cfe6ed5..3a98723 100644
--- a/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/TestVertxRestDispatcher.java
+++ b/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/TestVertxRestDispatcher.java
@@ -22,7 +22,7 @@
 import io.vertx.core.Vertx;
 import io.vertx.core.http.HttpServerRequest;
 import io.vertx.core.json.JsonObject;
-import io.vertx.core.net.SocketAddress;
+import io.vertx.ext.web.RequestBody;
 import io.vertx.ext.web.Router;
 import io.vertx.ext.web.RoutingContext;
 import mockit.Expectations;
@@ -228,22 +228,17 @@
   }
 
   @Test
-  public void onRequest(@Mocked Vertx vertx, @Mocked Context context, @Mocked HttpServerRequest request,
-      @Mocked SocketAddress socketAddress) {
-
+  public void onRequest(@Mocked Vertx vertx, @Mocked Context context) {
+    RequestBody requestBody = Mockito.mock(RequestBody.class);
+    HttpServerRequest request = Mockito.mock(HttpServerRequest.class);
     Map<String, Object> map = new HashMap<>();
-    RoutingContext routingContext = new MockUp<RoutingContext>() {
-      @Mock
-      RoutingContext put(String key, Object obj) {
-        map.put(key, obj);
-        return null;
-      }
-
-      @Mock
-      HttpServerRequest request() {
-        return request;
-      }
-    }.getMockInstance();
+    RoutingContext mockRoutingContext = Mockito.mock(RoutingContext.class);
+    Mockito.when(mockRoutingContext.body()).thenReturn(requestBody);
+    Mockito.when(mockRoutingContext.request()).thenReturn(request);
+    Mockito.doAnswer(invocation -> {
+      map.put(invocation.getArgument(0), invocation.getArgument(1));
+      return null;
+    }).when(mockRoutingContext).put(Mockito.anyString(), Mockito.any());
 
     new Expectations() {
       {
@@ -252,7 +247,7 @@
       }
     };
 
-    dispatcher.onRequest(routingContext);
+    dispatcher.onRequest(mockRoutingContext);
 
     Assertions.assertEquals(VertxRestInvocation.class, map.get(RestConst.REST_PRODUCER_INVOCATION).getClass());
     Assertions.assertTrue(invoked);