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.