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",