|
|
|
@ -161,14 +161,11 @@ Java:: |
|
|
|
public class MultipartExchangeFilterFunction implements ExchangeFilterFunction { |
|
|
|
public class MultipartExchangeFilterFunction implements ExchangeFilterFunction { |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
@Nonnull |
|
|
|
public Mono<ClientResponse> filter(ClientRequest request, ExchangeFunction next) { |
|
|
|
public Mono<ClientResponse> filter(@Nonnull ClientRequest request, @Nonnull ExchangeFunction next) { |
|
|
|
|
|
|
|
if (MediaType.MULTIPART_FORM_DATA.includes(request.headers().getContentType()) |
|
|
|
if (MediaType.MULTIPART_FORM_DATA.includes(request.headers().getContentType()) |
|
|
|
&& (request.method() == HttpMethod.PUT || request.method() == HttpMethod.POST)) { |
|
|
|
&& (request.method() == HttpMethod.PUT || request.method() == HttpMethod.POST)) { |
|
|
|
return next.exchange( |
|
|
|
return next.exchange(ClientRequest.from(request).body((outputMessage, context) -> |
|
|
|
ClientRequest.from(request) |
|
|
|
request.body().insert(new BufferingDecorator(outputMessage), context)).build() |
|
|
|
.body((outputMessage, context) -> request.body().insert(new BufferingDecorator(outputMessage), context)) |
|
|
|
|
|
|
|
.build() |
|
|
|
|
|
|
|
); |
|
|
|
); |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
return next.exchange(request); |
|
|
|
return next.exchange(request); |
|
|
|
@ -182,8 +179,7 @@ public class MultipartExchangeFilterFunction implements ExchangeFilterFunction { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
@Nonnull |
|
|
|
public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) { |
|
|
|
public Mono<Void> writeWith(@Nonnull Publisher<? extends DataBuffer> body) { |
|
|
|
|
|
|
|
return DataBufferUtils.join(body).flatMap(buffer -> { |
|
|
|
return DataBufferUtils.join(body).flatMap(buffer -> { |
|
|
|
getHeaders().setContentLength(buffer.readableByteCount()); |
|
|
|
getHeaders().setContentLength(buffer.readableByteCount()); |
|
|
|
return super.writeWith(Mono.just(buffer)); |
|
|
|
return super.writeWith(Mono.just(buffer)); |
|
|
|
@ -200,19 +196,25 @@ Kotlin:: |
|
|
|
class MultipartExchangeFilterFunction : ExchangeFilterFunction { |
|
|
|
class MultipartExchangeFilterFunction : ExchangeFilterFunction { |
|
|
|
|
|
|
|
|
|
|
|
override fun filter(request: ClientRequest, next: ExchangeFunction): Mono<ClientResponse> { |
|
|
|
override fun filter(request: ClientRequest, next: ExchangeFunction): Mono<ClientResponse> { |
|
|
|
return next.exchange(ClientRequest.from(request) |
|
|
|
return if (MediaType.MULTIPART_FORM_DATA.includes(request.headers().getContentType()) |
|
|
|
.body { message: ClientHttpRequest?, context: BodyInserter.Context? -> request.body().insert(BufferingDecorator(message), context!!) } |
|
|
|
&& (request.method() == HttpMethod.PUT || request.method() == HttpMethod.POST)) { |
|
|
|
|
|
|
|
next.exchange(ClientRequest.from(request) |
|
|
|
|
|
|
|
.body { message, context -> request.body().insert(BufferingDecorator(message), context) } |
|
|
|
.build()) |
|
|
|
.build()) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else { |
|
|
|
|
|
|
|
next.exchange(request) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private class BufferingDecorator(delegate: ClientHttpRequest?) : ClientHttpRequestDecorator(delegate!!) { |
|
|
|
private class BufferingDecorator(delegate: ClientHttpRequest) : ClientHttpRequestDecorator(delegate) { |
|
|
|
override fun writeWith(body: Publisher<out DataBuffer>): Mono<Void> { |
|
|
|
override fun writeWith(body: Publisher<out DataBuffer>): Mono<Void> { |
|
|
|
return DataBufferUtils.join(body) |
|
|
|
return DataBufferUtils.join(body) |
|
|
|
.flatMap { dataBuffer: DataBuffer -> |
|
|
|
.flatMap { |
|
|
|
val length = dataBuffer.readableByteCount() |
|
|
|
headers.contentLength = it.readableByteCount().toLong() |
|
|
|
headers.contentLength = length.toLong() |
|
|
|
super.writeWith(Mono.just(it)) |
|
|
|
super.writeWith(Mono.just(dataBuffer)) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|