parent
411b355f2c
commit
3ccbe3d1cb
|
@ -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))
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue