Skip to content

Commit f3dc998

Browse files
authored
[#4461]For netty changed add maxFormBufferedBytes & maxFormFields (#4464)
1 parent eb1bb1f commit f3dc998

File tree

6 files changed

+54
-4
lines changed

6 files changed

+54
-4
lines changed

demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/TestFormRequestSchema.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public void testRestTransport() throws Exception {
4444
testFormRequestFail();
4545
// testFormRequestFail会关闭连接,防止下个测试用例失败,睡眠2s
4646
Thread.sleep(2000);
47+
testFormRequestBufferSize();
4748
testFormRequestSuccess();
4849
}
4950

@@ -86,4 +87,28 @@ private void testFormRequestFail() throws Exception {
8687
TestMgr.check(e.getMessage().contains("Internal Server Error"), true);
8788
}
8889
}
90+
91+
private void testFormRequestBufferSize() {
92+
HttpHeaders headers = new HttpHeaders();
93+
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
94+
MultiValueMap<String, String> formData = new LinkedMultiValueMap<>();
95+
StringBuilder stringBuffer = new StringBuilder();
96+
for (int i = 0; i < 1020; i++) {
97+
stringBuffer.append("a");
98+
}
99+
formData.add("F0123456789001234567890012345678900123456789001234567890"
100+
+ "0123456789001234567890012345678900123456789001234567890", String.valueOf(stringBuffer)
101+
);
102+
HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(formData, headers);
103+
try {
104+
// we can not test a situation for form exceed max buffer size, because the netty buffer is very
105+
// big and the trunc can always be decoded and cached buffer size is always 0.
106+
ResponseEntity<String> responseEntity =
107+
restTemplate.postForEntity("cse://jaxrs/form/formLongName", requestEntity, String.class);
108+
TestMgr.check(responseEntity.getBody(), "formRequest success : 1020");
109+
} catch (Throwable e) {
110+
LOGGER.error("testFormRequestBufferSize-->", e);
111+
TestMgr.failed("", e);
112+
}
113+
}
89114
}

demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/FormRequestSchema.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,11 @@ public String formRequestSuccess(@FormParam("formData") String formData) throws
3838
return "formRequest success : " + formData.length();
3939
}
4040

41+
@Path("/formLongName")
42+
@POST
43+
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
44+
public String formLongName(@FormParam("F0123456789001234567890012345678900123456789001234567890"
45+
+ "0123456789001234567890012345678900123456789001234567890") String formData) throws Exception {
46+
return "formRequest success : " + formData.length();
47+
}
4148
}

demo/demo-jaxrs/jaxrs-server/src/main/resources/microservice.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ servicecomb:
2525
rest:
2626
address: 0.0.0.0:8080
2727
server:
28-
maxFormAttributeSize: 1024
28+
maxFormAttributeSize: 1024 # for testing, and bigger than netty buffer allocator
29+
maxFormBufferedBytes: 100
2930
highway:
3031
address: 0.0.0.0:7070
3132
handler:

transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/RestBodyHandler.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -311,12 +311,15 @@ public BHandler(RoutingContext context, long contentLength) {
311311

312312
context.request().exceptionHandler(t -> {
313313
context.cancelAndCleanupFileUploads();
314+
int sc = 200;
314315
if (t instanceof DecoderException) {
315316
// bad request
316-
context.fail(400, t.getCause());
317-
} else {
318-
context.fail(t);
317+
sc = 400;
318+
if (t.getCause() != null) {
319+
t = t.getCause();
320+
}
319321
}
322+
context.fail(sc, t);
320323
});
321324
}
322325

transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/RestServerVerticle.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,8 @@ private HttpServerOptions createDefaultHttpServerOptions() {
260260
serverOptions.setCompressionSupported(TransportConfig.getCompressed());
261261
serverOptions.setMaxHeaderSize(TransportConfig.getMaxHeaderSize());
262262
serverOptions.setMaxFormAttributeSize(TransportConfig.getMaxFormAttributeSize());
263+
serverOptions.setMaxFormFields(TransportConfig.getMaxFormFields());
264+
serverOptions.setMaxFormBufferedBytes(TransportConfig.getMaxFormBufferedBytes());
263265
serverOptions.setCompressionLevel(TransportConfig.getCompressionLevel());
264266
serverOptions.setMaxChunkSize(TransportConfig.getMaxChunkSize());
265267
serverOptions.setDecompressionSupported(TransportConfig.getDecompressionSupported());

transports/transport-rest/transport-rest-vertx/src/main/java/org/apache/servicecomb/transport/rest/vertx/TransportConfig.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,18 @@ public static int getMaxFormAttributeSize() {
6666
HttpServerOptions.DEFAULT_MAX_FORM_ATTRIBUTE_SIZE).get();
6767
}
6868

69+
public static int getMaxFormFields() {
70+
return DynamicPropertyFactory.getInstance()
71+
.getIntProperty("servicecomb.rest.server.maxFormFields",
72+
HttpServerOptions.DEFAULT_MAX_FORM_FIELDS).get();
73+
}
74+
75+
public static int getMaxFormBufferedBytes() {
76+
return DynamicPropertyFactory.getInstance()
77+
.getIntProperty("servicecomb.rest.server.maxFormBufferedBytes",
78+
HttpServerOptions.DEFAULT_MAX_FORM_BUFFERED_SIZE).get();
79+
}
80+
6981
public static int getCompressionLevel() {
7082
return DynamicPropertyFactory.getInstance()
7183
.getIntProperty("servicecomb.rest.server.compressionLevel",

0 commit comments

Comments
 (0)