Browse Source

Merge branch '5.3.x'

pull/28779/head
Arjen Poutsma 3 years ago
parent
commit
a64d3716e0
  1. 12
      spring-web/src/main/java/org/springframework/http/codec/multipart/MultipartUtils.java
  2. 25
      spring-web/src/main/java/org/springframework/http/codec/multipart/PartGenerator.java

12
spring-web/src/main/java/org/springframework/http/codec/multipart/MultipartUtils.java

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2002-2020 the original author or authors.
* Copyright 2002-2022 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -20,6 +20,8 @@ import java.io.IOException; @@ -20,6 +20,8 @@ import java.io.IOException;
import java.nio.channels.Channel;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.HttpHeaders;
@ -110,6 +112,14 @@ abstract class MultipartUtils { @@ -110,6 +112,14 @@ abstract class MultipartUtils {
}
}
public static void deleteFile(Path file) {
try {
Files.delete(file);
}
catch (IOException ignore) {
}
}
public static boolean isFormField(HttpHeaders headers) {
MediaType contentType = headers.getContentType();
return (contentType == null || MediaType.TEXT_PLAIN.equalsTypeAndSubtype(contentType))

25
spring-web/src/main/java/org/springframework/http/codec/multipart/PartGenerator.java

@ -555,6 +555,7 @@ final class PartGenerator extends BaseSubscriber<MultipartParser.Token> { @@ -555,6 +555,7 @@ final class PartGenerator extends BaseSubscriber<MultipartParser.Token> {
}
else {
MultipartUtils.closeChannel(newState.channel);
MultipartUtils.deleteFile(newState.file);
this.content.forEach(DataBufferUtils::release);
}
}
@ -586,6 +587,8 @@ final class PartGenerator extends BaseSubscriber<MultipartParser.Token> { @@ -586,6 +587,8 @@ final class PartGenerator extends BaseSubscriber<MultipartParser.Token> {
private volatile boolean closeOnDispose = true;
private volatile boolean deleteOnDispose = true;
public IdleFileState(WritingFileState state) {
this.headers = state.headers;
@ -600,16 +603,20 @@ final class PartGenerator extends BaseSubscriber<MultipartParser.Token> { @@ -600,16 +603,20 @@ final class PartGenerator extends BaseSubscriber<MultipartParser.Token> {
if (PartGenerator.this.maxDiskUsagePerPart == -1 || count <= PartGenerator.this.maxDiskUsagePerPart) {
this.closeOnDispose = false;
this.deleteOnDispose = false;
WritingFileState newState = new WritingFileState(this);
if (changeState(this, newState)) {
newState.writeBuffer(dataBuffer);
}
else {
MultipartUtils.closeChannel(this.channel);
MultipartUtils.deleteFile(this.file);
DataBufferUtils.release(dataBuffer);
}
}
else {
MultipartUtils.closeChannel(this.channel);
MultipartUtils.deleteFile(this.file);
DataBufferUtils.release(dataBuffer);
emitError(new DataBufferLimitException(
"Part exceeded the disk usage limit of " + PartGenerator.this.maxDiskUsagePerPart +
@ -620,6 +627,7 @@ final class PartGenerator extends BaseSubscriber<MultipartParser.Token> { @@ -620,6 +627,7 @@ final class PartGenerator extends BaseSubscriber<MultipartParser.Token> {
@Override
public void onComplete() {
MultipartUtils.closeChannel(this.channel);
this.deleteOnDispose = false;
emitPart(DefaultParts.part(this.headers, this.file, PartGenerator.this.blockingOperationScheduler));
}
@ -628,6 +636,9 @@ final class PartGenerator extends BaseSubscriber<MultipartParser.Token> { @@ -628,6 +636,9 @@ final class PartGenerator extends BaseSubscriber<MultipartParser.Token> {
if (this.closeOnDispose) {
MultipartUtils.closeChannel(this.channel);
}
if (this.deleteOnDispose) {
MultipartUtils.deleteFile(this.file);
}
}
@ -651,6 +662,8 @@ final class PartGenerator extends BaseSubscriber<MultipartParser.Token> { @@ -651,6 +662,8 @@ final class PartGenerator extends BaseSubscriber<MultipartParser.Token> {
private volatile boolean completed;
private volatile boolean disposed;
public WritingFileState(CreateFileState state, Path file, WritableByteChannel channel) {
this.headers = state.headers;
@ -701,11 +714,15 @@ final class PartGenerator extends BaseSubscriber<MultipartParser.Token> { @@ -701,11 +714,15 @@ final class PartGenerator extends BaseSubscriber<MultipartParser.Token> {
if (this.completed) {
newState.onComplete();
}
else if (this.disposed) {
newState.dispose();
}
else if (changeState(this, newState)) {
requestToken();
}
else {
MultipartUtils.closeChannel(this.channel);
MultipartUtils.deleteFile(this.file);
}
}
@ -719,6 +736,8 @@ final class PartGenerator extends BaseSubscriber<MultipartParser.Token> { @@ -719,6 +736,8 @@ final class PartGenerator extends BaseSubscriber<MultipartParser.Token> {
return Mono.empty();
}
catch (IOException ex) {
MultipartUtils.closeChannel(this.channel);
MultipartUtils.deleteFile(this.file);
return Mono.error(ex);
}
finally {
@ -726,6 +745,12 @@ final class PartGenerator extends BaseSubscriber<MultipartParser.Token> { @@ -726,6 +745,12 @@ final class PartGenerator extends BaseSubscriber<MultipartParser.Token> {
}
}
@Override
public void dispose() {
this.disposed = true;
}
@Override
public String toString() {
return "WRITE-FILE";

Loading…
Cancel
Save