diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/BodyExtractors.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/BodyExtractors.java
index 7d40b99ab6c..84b406949f2 100644
--- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/BodyExtractors.java
+++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/BodyExtractors.java
@@ -165,19 +165,22 @@ public abstract class BodyExtractors {
/**
* Return a {@code BodyExtractor} that reads form data into a {@link MultiValueMap}.
+ *
As of 5.1 this method can also be used on the client side to read form
+ * data from a server response (e.g. OAuth).
* @return a {@code BodyExtractor} that reads form data
*/
- // Note that the returned BodyExtractor is parameterized to ServerHttpRequest, not
- // ReactiveHttpInputMessage like other methods, since reading form data only typically happens on
- // the server-side
- public static BodyExtractor>, ServerHttpRequest> toFormData() {
- return (request, context) -> {
+ public static BodyExtractor>, ReactiveHttpInputMessage> toFormData() {
+ return (message, context) -> {
ResolvableType type = FORM_MAP_TYPE;
HttpMessageReader> reader =
messageReader(type, MediaType.APPLICATION_FORM_URLENCODED, context);
- return context.serverResponse()
- .map(response -> reader.readMono(type, type, request, response, context.hints()))
- .orElseGet(() -> reader.readMono(type, request, context.hints()));
+ Optional response = context.serverResponse();
+ if (response.isPresent() && message instanceof ServerHttpRequest) {
+ return reader.readMono(type, type, (ServerHttpRequest) message, response.get(), context.hints());
+ }
+ else {
+ return reader.readMono(type, message, context.hints());
+ }
};
}
diff --git a/spring-webflux/src/test/java/org/springframework/web/reactive/function/BodyExtractorsTests.java b/spring-webflux/src/test/java/org/springframework/web/reactive/function/BodyExtractorsTests.java
index cc04abfb5d0..fd7d005581d 100644
--- a/spring-webflux/src/test/java/org/springframework/web/reactive/function/BodyExtractorsTests.java
+++ b/spring-webflux/src/test/java/org/springframework/web/reactive/function/BodyExtractorsTests.java
@@ -107,7 +107,7 @@ public class BodyExtractorsTests {
@Test
- public void toMono() throws Exception {
+ public void toMono() {
BodyExtractor, ReactiveHttpInputMessage> extractor = BodyExtractors.toMono(String.class);
DefaultDataBufferFactory factory = new DefaultDataBufferFactory();
@@ -125,7 +125,7 @@ public class BodyExtractorsTests {
}
@Test
- public void toMonoParameterizedTypeReference() throws Exception {
+ public void toMonoParameterizedTypeReference() {
BodyExtractor>, ReactiveHttpInputMessage> extractor =
BodyExtractors.toMono(new ParameterizedTypeReference