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);