Spring : 5.3.12 Java : 1.8
I'm trying to forward the multipart data to another API. I'm successfully able to do it.
2022-04-07 22:26:06,822 LL="INFO" TR="loopClient-nio-3" LN="com.example.demo.MainController" Content Type of this request multipart/form-data;boundary=--------------------------011142320810236414887622
2022-04-07 22:26:06,822 LL="INFO" TR="loopClient-nio-3" LN="reactor.Mono.MapFuseable.2" | onSubscribe([Fuseable] FluxMapFuseable.MapFuseableSubscriber)
2022-04-07 22:26:06,822 LL="INFO" TR="loopClient-nio-3" LN="reactor.Mono.MapFuseable.2" | request(unbounded)
2022-04-07 22:26:06,825 LL="INFO" TR="loopClient-nio-3" LN="reactor.Mono.MapFuseable.2" | onNext({res3=[DefaultFormFieldPart{res3}], res2=[DefaultFilePart{res2 (test.txt)}]})
2022-04-07 22:26:06,825 LL="INFO" TR="loopClient-nio-3" LN="com.example.demo.MainController" Total size 2
2022-04-07 22:26:06,825 LL="INFO" TR="loopClient-nio-3" LN="com.example.demo.MainController" FormFieldPart: res3
2022-04-07 22:26:06,825 LL="INFO" TR="loopClient-nio-3" LN="com.example.demo.MainController" FilePart: res2
2022-04-07 22:26:06,831 LL="INFO" TR="loopClient-nio-3" LN="reactor.Mono.MapFuseable.2" | onComplete()
However, I want to enable streaming for multipart so that data directly streamed to backend through webclient. So, Added following configuration
@Configuration
@EnableWebFlux
public class WebConfig implements WebFluxConfigurer {
@Override
public void configureHttpMessageCodecs(ServerCodecConfigurer configurer) {
configurer.defaultCodecs().multipartReader(new MultipartHttpMessageReader(defaultPartHttpMessageReader()));
}
public DefaultPartHttpMessageReader defaultPartHttpMessageReader() {
DefaultPartHttpMessageReader defaultPartHttpMessageReader = new DefaultPartHttpMessageReader();
defaultPartHttpMessageReader.setStreaming(true);
return defaultPartHttpMessageReader;
}
}
After adding above configuration, if I attach file in multipart request then request get stuck for forever and never completes. Referring to application log, could see following :
2022-04-07 22:23:27,109 LL="INFO" TR="loopClient-nio-3" LN="com.example.demo.MainController" Content Type of this request multipart/form-data;boundary=--------------------------227791809638103619563128
2022-04-07 22:23:27,126 LL="INFO" TR="loopClient-nio-3" LN="reactor.Mono.MapFuseable.1" | onSubscribe([Fuseable] FluxMapFuseable.MapFuseableSubscriber)
2022-04-07 22:23:27,128 LL="INFO" TR="loopClient-nio-3" LN="reactor.Mono.MapFuseable.1" | request(unbounded)
Comparing with working scenario (very first log), onNext
was not triggered in this scenario. However, if I just send form data as part of multipart request, then it successfully get completed.
2022-04-07 22:22:06,822 LL="INFO" TR="loopClient-nio-3" LN="com.example.demo.MainController" Content Type of this request multipart/form-data;boundary=--------------------------227791809638103619563128
2022-04-07 22:22:06,822 LL="INFO" TR="loopClient-nio-3" LN="reactor.Mono.MapFuseable.2" | onSubscribe([Fuseable] FluxMapFuseable.MapFuseableSubscriber)
2022-04-07 22:22:06,822 LL="INFO" TR="loopClient-nio-3" LN="reactor.Mono.MapFuseable.2" | request(unbounded)
2022-04-07 22:22:06,825 LL="INFO" TR="loopClient-nio-3" LN="reactor.Mono.MapFuseable.2" | onNext({res3=[DefaultFormFieldPart{res3}]})
2022-04-07 22:22:06,825 LL="INFO" TR="loopClient-nio-3" LN="com.example.demo.MainController" Total size 1
2022-04-07 22:22:06,825 LL="INFO" TR="loopClient-nio-3" LN="com.example.demo.MainController" FormFieldPart: res3
2022-04-07 22:22:06,831 LL="INFO" TR="loopClient-nio-3" LN="reactor.Mono.MapFuseable.2" | onComplete()
Could you share input for above issue ?
Comment From: poutsma
As I've tried to explain to you in #28296, the streaming mode of DefaultPartHttpMessageReader
has fundamental limitations which cannot be resolved easily. The feature will be most likely be deprecated as of Spring Framework 6.0 in favor of #28006.
Comment From: poutsma
Closing this issue, because we have deprecated DefaultPartHttpMessageReader
's streaming mode in 6.0 RC1, in favor of the PartEvent
API described in #28006.