Skip to content

Commit 0d8eb26

Browse files
committed
Use DefaultPartHttpMessageReader with Framework 5.3
Closes gh-703
1 parent 562fd9f commit 0d8eb26

File tree

2 files changed

+32
-5
lines changed

2 files changed

+32
-5
lines changed

spring-restdocs-webtestclient/build.gradle

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,10 @@ matrixTest {
2121
group = 'org.springframework'
2222
versions = ['5.1.+', '5.2.+', '5.3.+']
2323
}
24-
}
24+
}
25+
26+
project.afterEvaluate {
27+
configurations.getByName('testRuntimeClasspath_org.springframework_5.3.+') {
28+
exclude group: 'org.synchronoss.cloud', module: 'nio-multipart-parser'
29+
}
30+
}

spring-restdocs-webtestclient/src/main/java/org/springframework/restdocs/webtestclient/WebTestClientRequestConverter.java

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2014-2019 the original author or authors.
2+
* Copyright 2014-2020 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -33,6 +33,7 @@
3333
import org.springframework.http.MediaType;
3434
import org.springframework.http.ReactiveHttpInputMessage;
3535
import org.springframework.http.codec.FormHttpMessageReader;
36+
import org.springframework.http.codec.HttpMessageReader;
3637
import org.springframework.http.codec.multipart.FilePart;
3738
import org.springframework.http.codec.multipart.MultipartHttpMessageReader;
3839
import org.springframework.http.codec.multipart.Part;
@@ -59,6 +60,8 @@
5960
*/
6061
class WebTestClientRequestConverter implements RequestConverter<ExchangeResult> {
6162

63+
private static final String DEFAULT_PART_HTTP_MESSAGE_READER = "org.springframework.http.codec.multipart.DefaultPartHttpMessageReader";
64+
6265
private static final ResolvableType FORM_DATA_TYPE = ResolvableType.forClassWithGenerics(MultiValueMap.class,
6366
String.class, String.class);
6467

@@ -91,17 +94,35 @@ private Parameters extractParameters(ExchangeResult result) {
9194
}
9295

9396
private List<OperationRequestPart> extractRequestParts(ExchangeResult result) {
94-
if (!ClassUtils.isPresent("org.synchronoss.cloud.nio.multipart.NioMultipartParserListener",
95-
getClass().getClassLoader())) {
97+
HttpMessageReader<Part> partHttpMessageReader = findPartHttpMessageReader();
98+
if (partHttpMessageReader == null) {
9699
return Collections.emptyList();
97100
}
98-
return new MultipartHttpMessageReader(new SynchronossPartHttpMessageReader())
101+
return new MultipartHttpMessageReader(partHttpMessageReader)
99102
.readMono(ResolvableType.forClass(Part.class), new ExchangeResultReactiveHttpInputMessage(result),
100103
Collections.emptyMap())
101104
.onErrorReturn(new LinkedMultiValueMap<>()).block().values().stream()
102105
.flatMap((parts) -> parts.stream().map(this::createOperationRequestPart)).collect(Collectors.toList());
103106
}
104107

108+
@SuppressWarnings("unchecked")
109+
private HttpMessageReader<Part> findPartHttpMessageReader() {
110+
if (ClassUtils.isPresent(DEFAULT_PART_HTTP_MESSAGE_READER, getClass().getClassLoader())) {
111+
try {
112+
return (HttpMessageReader<Part>) Class
113+
.forName(DEFAULT_PART_HTTP_MESSAGE_READER, true, getClass().getClassLoader()).newInstance();
114+
}
115+
catch (Exception ex) {
116+
// Continue
117+
}
118+
}
119+
if (ClassUtils.isPresent("org.synchronoss.cloud.nio.multipart.NioMultipartParserListener",
120+
getClass().getClassLoader())) {
121+
return new SynchronossPartHttpMessageReader();
122+
}
123+
return null;
124+
}
125+
105126
private OperationRequestPart createOperationRequestPart(Part part) {
106127
ByteArrayOutputStream content = readPartBodyContent(part);
107128
return new OperationRequestPartFactory().create(part.name(),

0 commit comments

Comments
 (0)