forked from Qortal/qortal
Fixed slow validation issue caused by loading the entire resource into memory.
This commit is contained in:
parent
05b4ecd4ed
commit
fc10b61193
@ -107,7 +107,7 @@ public enum Service {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Require valid JSON
|
// Require valid JSON
|
||||||
byte[] data = FilesystemUtils.getSingleFileContents(path);
|
byte[] data = FilesystemUtils.getSingleFileContents(path, 25*1024);
|
||||||
String json = new String(data, StandardCharsets.UTF_8);
|
String json = new String(data, StandardCharsets.UTF_8);
|
||||||
try {
|
try {
|
||||||
objectMapper.readTree(json);
|
objectMapper.readTree(json);
|
||||||
@ -201,7 +201,9 @@ public enum Service {
|
|||||||
return ValidationResult.OK;
|
return ValidationResult.OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
byte[] data = FilesystemUtils.getSingleFileContents(path);
|
// Load the first 25KB of data. This only needs to be long enough to check the prefix
|
||||||
|
// and also to allow for possible additional future validation of smaller files.
|
||||||
|
byte[] data = FilesystemUtils.getSingleFileContents(path, 25*1024);
|
||||||
long size = FilesystemUtils.getDirectorySize(path);
|
long size = FilesystemUtils.getDirectorySize(path);
|
||||||
|
|
||||||
// Validate max size if needed
|
// Validate max size if needed
|
||||||
|
@ -228,12 +228,18 @@ public class FilesystemUtils {
|
|||||||
* @throws IOException
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
public static byte[] getSingleFileContents(Path path) throws IOException {
|
public static byte[] getSingleFileContents(Path path) throws IOException {
|
||||||
|
return getSingleFileContents(path, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static byte[] getSingleFileContents(Path path, Integer maxLength) throws IOException {
|
||||||
byte[] data = null;
|
byte[] data = null;
|
||||||
// TODO: limit the file size that can be loaded into memory
|
// TODO: limit the file size that can be loaded into memory
|
||||||
|
|
||||||
// If the path is a file, read the contents directly
|
// If the path is a file, read the contents directly
|
||||||
if (path.toFile().isFile()) {
|
if (path.toFile().isFile()) {
|
||||||
data = Files.readAllBytes(path);
|
int fileSize = (int)path.toFile().length();
|
||||||
|
maxLength = maxLength != null ? Math.min(maxLength, fileSize) : fileSize;
|
||||||
|
data = FilesystemUtils.readFromFile(path.toString(), 0, maxLength);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Or if it's a directory, only load file contents if there is a single file inside it
|
// Or if it's a directory, only load file contents if there is a single file inside it
|
||||||
@ -242,7 +248,9 @@ public class FilesystemUtils {
|
|||||||
if (files.length == 1) {
|
if (files.length == 1) {
|
||||||
Path filePath = Paths.get(path.toString(), files[0]);
|
Path filePath = Paths.get(path.toString(), files[0]);
|
||||||
if (filePath.toFile().isFile()) {
|
if (filePath.toFile().isFile()) {
|
||||||
data = Files.readAllBytes(filePath);
|
int fileSize = (int)filePath.toFile().length();
|
||||||
|
maxLength = maxLength != null ? Math.min(maxLength, fileSize) : fileSize;
|
||||||
|
data = FilesystemUtils.readFromFile(filePath.toString(), 0, maxLength);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user