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

liubao pushed a commit to branch 2.8.x
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git


The following commit(s) were added to refs/heads/2.8.x by this push:
     new f3dc998d7 [#4461]For netty changed add maxFormBufferedBytes & 
maxFormFields (#4464)
f3dc998d7 is described below

commit f3dc998d78394fec8d6755192a57ab7ea889b859
Author: liubao68 <[email protected]>
AuthorDate: Fri Aug 9 16:44:16 2024 +0800

    [#4461]For netty changed add maxFormBufferedBytes & maxFormFields (#4464)
---
 .../demo/jaxrs/client/TestFormRequestSchema.java   | 25 ++++++++++++++++++++++
 .../demo/jaxrs/server/FormRequestSchema.java       |  7 ++++++
 .../src/main/resources/microservice.yaml           |  3 ++-
 .../transport/rest/vertx/RestBodyHandler.java      |  9 +++++---
 .../transport/rest/vertx/RestServerVerticle.java   |  2 ++
 .../transport/rest/vertx/TransportConfig.java      | 12 +++++++++++
 6 files changed, 54 insertions(+), 4 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 f0e9938c1..776bd277f 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
@@ -44,6 +44,7 @@ public class TestFormRequestSchema implements 
CategorizedTestCase {
     testFormRequestFail();
     // testFormRequestFail会关闭连接,防止下个测试用例失败,睡眠2s
     Thread.sleep(2000);
+    testFormRequestBufferSize();
     testFormRequestSuccess();
   }
 
@@ -86,4 +87,28 @@ 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<>();
+    StringBuilder stringBuffer = new StringBuilder();
+    for (int i = 0; i < 1020; i++) {
+      stringBuffer.append("a");
+    }
+    formData.add("F0123456789001234567890012345678900123456789001234567890"
+        + "0123456789001234567890012345678900123456789001234567890", 
String.valueOf(stringBuffer)
+    );
+    HttpEntity<MultiValueMap<String, String>> requestEntity = new 
HttpEntity<>(formData, headers);
+    try {
+      // 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.
+      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 7ceaf74be..2a62049f1 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
@@ -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 f4f585ecc..c4b4f4afe 100644
--- a/demo/demo-jaxrs/jaxrs-server/src/main/resources/microservice.yaml
+++ b/demo/demo-jaxrs/jaxrs-server/src/main/resources/microservice.yaml
@@ -25,7 +25,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
   handler:
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 c9266b180..9aa9cc934 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
@@ -260,6 +260,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 70490e0f3..62b76c899 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
@@ -66,6 +66,18 @@ public final class TransportConfig {
             HttpServerOptions.DEFAULT_MAX_FORM_ATTRIBUTE_SIZE).get();
   }
 
+  public static int getMaxFormFields() {
+    return DynamicPropertyFactory.getInstance()
+        .getIntProperty("servicecomb.rest.server.maxFormFields",
+            HttpServerOptions.DEFAULT_MAX_FORM_FIELDS).get();
+  }
+
+  public static int getMaxFormBufferedBytes() {
+    return DynamicPropertyFactory.getInstance()
+        .getIntProperty("servicecomb.rest.server.maxFormBufferedBytes",
+            HttpServerOptions.DEFAULT_MAX_FORM_BUFFERED_SIZE).get();
+  }
+
   public static int getCompressionLevel() {
     return DynamicPropertyFactory.getInstance()
         .getIntProperty("servicecomb.rest.server.compressionLevel",

Reply via email to