yuejq commented on issue #4558:
URL: https://github.com/apache/shenyu/issues/4558#issuecomment-1666812898
`public class FileSizeFilter implements WebFilter {
private static final int BYTES_PER_MB = 1024 * 1024;
private final int fileMaxSize;
@Override
@NonNull
public Mono<Void> filter(@NonNull final ServerWebExchange exchange,
@NonNull final WebFilterChain chain) {
MediaType mediaType =
exchange.getRequest().getHeaders().getContentType();
if (MediaType.MULTIPART_FORM_DATA.isCompatibleWith(mediaType)) {
ServerRequest serverRequest = ServerRequest.create(exchange,
messageReaders);
return serverRequest.bodyToMono(DataBuffer.class)
.flatMap(dataBuffer -> {
**_if (dataBuffer.capacity() > BYTES_PER_MB *
fileMaxSize) {_**
ServerHttpResponse response =
exchange.getResponse();
response.setStatusCode(HttpStatus.BAD_REQUEST);
Object error = ShenyuResultWrap.error(exchange,
ShenyuResultEnum.PAYLOAD_TOO_LARGE);
LOG.info("The file size exceeds the limit. The
actual size is {}M , response:{}", dataBuffer.capacity() / BYTES_PER_MB, error);
return WebFluxResultUtils.result(exchange,
error);
}
BodyInserter<Mono<DataBuffer>,
ReactiveHttpOutputMessage> bodyInsert =
BodyInserters.fromPublisher(Mono.just(dataBuffer), DataBuffer.class);
HttpHeaders headers = new HttpHeaders();
headers.putAll(exchange.getRequest().getHeaders());
headers.remove(HttpHeaders.CONTENT_LENGTH);
CachedBodyOutputMessage outputMessage = new
CachedBodyOutputMessage(
exchange, headers);
return bodyInsert.insert(outputMessage, new
BodyInserterContext())
.then(Mono.defer(() -> {
ServerHttpRequest decorator =
decorate(exchange, outputMessage);
return
chain.filter(exchange.mutate().request(decorator).build());
})).doFinally(signalType ->
DataBufferUtils.release(dataBuffer))
.onErrorResume((Function<Throwable,
Mono<Void>>) throwable -> ResponseUtils.release(outputMessage, throwable));
});
}
return chain.filter(exchange);
}
}`
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscr...@shenyu.apache.org
For queries about this service, please contact Infrastructure at:
us...@infra.apache.org