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 9dac60bef [#4461]For netty changed add maxFormBufferedBytes & 
maxFormFields (#4462)
9dac60bef is described below

commit 9dac60bef4c4d57f8e5ff5854bcef2a4d5eb1b24
Author: liubao68 <[email protected]>
AuthorDate: Fri Aug 9 08:51:28 2024 +0800

    [#4461]For netty changed add maxFormBufferedBytes & maxFormFields (#4462)
---
 .../demo/jaxrs/client/TestFormRequestSchema.java   | 41 +++++++++++++++-------
 .../demo/jaxrs/server/FormRequestSchema.java       | 11 ++++--
 .../src/main/resources/microservice.yaml           |  3 +-
 .../transport/rest/vertx/RestBodyHandler.java      |  9 +++--
 .../transport/rest/vertx/RestServerVerticle.java   |  2 ++
 .../transport/rest/vertx/TransportConfig.java      | 10 ++++++
 .../rest/vertx/TestRestServerVerticle.java         |  8 +++++
 7 files changed, 65 insertions(+), 19 deletions(-)

diff --git 
a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/TestFormRequestSchema.java
 
b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/TestFormRequestSchema.java
index 22163e265..591302058 100644
--- 
a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/TestFormRequestSchema.java
+++ 
b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/TestFormRequestSchema.java
@@ -37,7 +37,7 @@ public class TestFormRequestSchema implements 
CategorizedTestCase {
 
   private static final Logger LOGGER = 
LoggerFactory.getLogger(TestFormRequestSchema.class);
 
-  private RestOperations restTemplate = RestTemplateBuilder.create();
+  private final RestOperations restTemplate = RestTemplateBuilder.create();
 
   @Override
   public void testRestTransport() throws Exception {
@@ -45,19 +45,16 @@ public class TestFormRequestSchema implements 
CategorizedTestCase {
     // testFormRequestFail会关闭连接,防止下个测试用例失败,睡眠2s
     Thread.sleep(2000);
     testFormRequestSuccess();
+    testFormRequestBufferSize();
   }
 
   // formSize is less than default maxFormAttributeSize , success
-  private void testFormRequestSuccess() throws Exception {
+  private void testFormRequestSuccess() {
     try {
       HttpHeaders headers = new HttpHeaders();
       headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
       MultiValueMap<String, String> formData = new LinkedMultiValueMap<>();
-      StringBuilder stringBuffer = new StringBuilder();
-      for (int i = 0; i < 512; i++) {
-        stringBuffer.append("a");
-      }
-      formData.add("formData", stringBuffer.toString());
+      formData.add("formData", "a".repeat(512));
       HttpEntity<MultiValueMap<String, String>> requestEntity = new 
HttpEntity<>(formData, headers);
       ResponseEntity<String> responseEntity = restTemplate
           .postForEntity("cse://jaxrs/form/formRequest", requestEntity, 
String.class);
@@ -69,15 +66,11 @@ public class TestFormRequestSchema implements 
CategorizedTestCase {
   }
 
   // formSize is greater than default maxFormAttributeSize , throw exception
-  private void testFormRequestFail() throws Exception {
+  private void testFormRequestFail() {
     HttpHeaders headers = new HttpHeaders();
     headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
     MultiValueMap<String, String> formData = new LinkedMultiValueMap<>();
-    StringBuilder stringBuffer = new StringBuilder();
-    for (int i = 0; i < 1688; i++) {
-      stringBuffer.append("a");
-    }
-    formData.add("formData", String.valueOf(stringBuffer));
+    formData.add("formData", "a".repeat(1688));
     HttpEntity<MultiValueMap<String, String>> requestEntity = new 
HttpEntity<>(formData, headers);
     try {
       restTemplate.postForEntity("cse://jaxrs/form/formRequest", 
requestEntity, String.class);
@@ -86,4 +79,26 @@ public class TestFormRequestSchema implements 
CategorizedTestCase {
       TestMgr.check(e.getMessage().contains("Internal Server Error"), true);
     }
   }
+
+  private void testFormRequestBufferSize() {
+    HttpHeaders headers = new HttpHeaders();
+    headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+    MultiValueMap<String, String> formData = new LinkedMultiValueMap<>();
+    // we can not test a situation for form exceed max buffer size, because 
the netty buffer is very
+    // big and the trunc can always be decoded and cached buffer size is 
always 0.
+    formData.add("F0123456789001234567890012345678900123456789001234567890"
+            + "0123456789001234567890012345678900123456789001234567890", 
"a".repeat(1020)
+        // we can not test a situation for form exceed max buffer size, 
because the netty buffer is very
+        // big and the trunc can always be decoded and cached buffer size is 
always 0.
+    );
+    HttpEntity<MultiValueMap<String, String>> requestEntity = new 
HttpEntity<>(formData, headers);
+    try {
+      ResponseEntity<String> responseEntity =
+          restTemplate.postForEntity("cse://jaxrs/form/formLongName", 
requestEntity, String.class);
+      TestMgr.check(responseEntity.getBody(), "formRequest success : 1020");
+    } catch (Throwable e) {
+      LOGGER.error("testFormRequestBufferSize-->", e);
+      TestMgr.failed("", e);
+    }
+  }
 }
diff --git 
a/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/FormRequestSchema.java
 
b/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/FormRequestSchema.java
index f36e17911..267068121 100644
--- 
a/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/FormRequestSchema.java
+++ 
b/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/FormRequestSchema.java
@@ -17,6 +17,8 @@
 
 package org.apache.servicecomb.demo.jaxrs.server;
 
+import org.apache.servicecomb.provider.rest.common.RestSchema;
+
 import jakarta.ws.rs.Consumes;
 import jakarta.ws.rs.FormParam;
 import jakarta.ws.rs.POST;
@@ -24,8 +26,6 @@ import jakarta.ws.rs.Path;
 import jakarta.ws.rs.Produces;
 import jakarta.ws.rs.core.MediaType;
 
-import org.apache.servicecomb.provider.rest.common.RestSchema;
-
 @RestSchema(schemaId = "FormRequestSchema")
 @Path("/form")
 @Produces(MediaType.APPLICATION_JSON)
@@ -38,4 +38,11 @@ public class FormRequestSchema {
     return "formRequest success : " + formData.length();
   }
 
+  @Path("/formLongName")
+  @POST
+  @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
+  public String 
formLongName(@FormParam("F0123456789001234567890012345678900123456789001234567890"
+      + "0123456789001234567890012345678900123456789001234567890") String 
formData) throws Exception {
+    return "formRequest success : " + formData.length();
+  }
 }
diff --git a/demo/demo-jaxrs/jaxrs-server/src/main/resources/microservice.yaml 
b/demo/demo-jaxrs/jaxrs-server/src/main/resources/microservice.yaml
index 40cb567a9..475708a55 100644
--- a/demo/demo-jaxrs/jaxrs-server/src/main/resources/microservice.yaml
+++ b/demo/demo-jaxrs/jaxrs-server/src/main/resources/microservice.yaml
@@ -27,7 +27,8 @@ servicecomb:
   rest:
     address: 0.0.0.0:8080
     server:
-      maxFormAttributeSize: 1024
+      maxFormAttributeSize: 1024 # for testing, and bigger than netty buffer 
allocator
+      maxFormBufferedBytes: 100
   highway:
     address: 0.0.0.0:7070
   uploads:
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 54e1331a8..6492e77e8 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
@@ -311,12 +311,15 @@ public class RestBodyHandler implements BodyHandler {
 
       context.request().exceptionHandler(t -> {
         context.cancelAndCleanupFileUploads();
+        int sc = 200;
         if (t instanceof DecoderException) {
           // bad request
-          context.fail(400, t.getCause());
-        } else {
-          context.fail(t);
+          sc = 400;
+          if (t.getCause() != null) {
+            t = t.getCause();
+          }
         }
+        context.fail(sc, t);
       });
     }
 
diff --git 
a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/RestServerVerticle.java
 
b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/RestServerVerticle.java
index 74551458b..037f4c9e6 100644
--- 
a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/RestServerVerticle.java
+++ 
b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/RestServerVerticle.java
@@ -271,6 +271,8 @@ public class RestServerVerticle extends AbstractVerticle {
     serverOptions.setCompressionSupported(TransportConfig.getCompressed());
     serverOptions.setMaxHeaderSize(TransportConfig.getMaxHeaderSize());
     
serverOptions.setMaxFormAttributeSize(TransportConfig.getMaxFormAttributeSize());
+    serverOptions.setMaxFormFields(TransportConfig.getMaxFormFields());
+    
serverOptions.setMaxFormBufferedBytes(TransportConfig.getMaxFormBufferedBytes());
     serverOptions.setCompressionLevel(TransportConfig.getCompressionLevel());
     serverOptions.setMaxChunkSize(TransportConfig.getMaxChunkSize());
     
serverOptions.setDecompressionSupported(TransportConfig.getDecompressionSupported());
diff --git 
a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/TransportConfig.java
 
b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/TransportConfig.java
index 900c07227..5c81d7564 100644
--- 
a/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/TransportConfig.java
+++ 
b/transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/TransportConfig.java
@@ -61,6 +61,16 @@ public final class TransportConfig {
         HttpServerOptions.DEFAULT_MAX_FORM_ATTRIBUTE_SIZE);
   }
 
+  public static int getMaxFormFields() {
+    return 
LegacyPropertyFactory.getIntProperty("servicecomb.rest.server.maxFormFields",
+        HttpServerOptions.DEFAULT_MAX_FORM_FIELDS);
+  }
+
+  public static int getMaxFormBufferedBytes() {
+    return 
LegacyPropertyFactory.getIntProperty("servicecomb.rest.server.maxFormBufferedBytes",
+        HttpServerOptions.DEFAULT_MAX_FORM_BUFFERED_SIZE);
+  }
+
   public static int getCompressionLevel() {
     return 
LegacyPropertyFactory.getIntProperty("servicecomb.rest.server.compressionLevel",
         HttpServerOptions.DEFAULT_COMPRESSION_LEVEL);
diff --git 
a/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/TestRestServerVerticle.java
 
b/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/TestRestServerVerticle.java
index 7193f6541..b3c1f7108 100644
--- 
a/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/TestRestServerVerticle.java
+++ 
b/transports/transport-rest/transport-rest-vertx/src/test/java/org/apache/servicecomb/transport/rest/vertx/TestRestServerVerticle.java
@@ -23,6 +23,8 @@ import static 
io.vertx.core.http.HttpServerOptions.DEFAULT_DECOMPRESSION_SUPPORT
 import static 
io.vertx.core.http.HttpServerOptions.DEFAULT_HTTP2_CONNECTION_WINDOW_SIZE;
 import static io.vertx.core.http.HttpServerOptions.DEFAULT_MAX_CHUNK_SIZE;
 import static 
io.vertx.core.http.HttpServerOptions.DEFAULT_MAX_FORM_ATTRIBUTE_SIZE;
+import static 
io.vertx.core.http.HttpServerOptions.DEFAULT_MAX_FORM_BUFFERED_SIZE;
+import static io.vertx.core.http.HttpServerOptions.DEFAULT_MAX_FORM_FIELDS;
 import static 
io.vertx.core.http.HttpServerOptions.DEFAULT_MAX_INITIAL_LINE_LENGTH;
 import static 
org.apache.servicecomb.common.accessLog.AccessLogConfig.CLIENT_LOG_ENABLED;
 import static 
org.apache.servicecomb.common.accessLog.AccessLogConfig.CLIENT_LOG_PATTERN;
@@ -127,6 +129,12 @@ public class TestRestServerVerticle {
     
Mockito.when(environment.getProperty("servicecomb.rest.server.compressionLevel",
 int.class,
             DEFAULT_COMPRESSION_LEVEL))
         .thenReturn(DEFAULT_COMPRESSION_LEVEL);
+    
Mockito.when(environment.getProperty("servicecomb.rest.server.maxFormFields", 
int.class,
+            DEFAULT_MAX_FORM_FIELDS))
+        .thenReturn(DEFAULT_MAX_FORM_FIELDS);
+    
Mockito.when(environment.getProperty("servicecomb.rest.server.maxFormBufferedBytes",
 int.class,
+            DEFAULT_MAX_FORM_BUFFERED_SIZE))
+        .thenReturn(DEFAULT_MAX_FORM_BUFFERED_SIZE);
     
Mockito.when(environment.getProperty("servicecomb.rest.server.maxChunkSize", 
int.class,
             DEFAULT_MAX_CHUNK_SIZE))
         .thenReturn(DEFAULT_MAX_CHUNK_SIZE);

Reply via email to