DigestUtils processes InputStream with buffered read instead of full copy

Issue: SPR-14427
This commit is contained in:
Juergen Hoeller 2016-07-08 12:20:49 +02:00
parent 2bf9bc312e
commit 61db8e9f1e
2 changed files with 38 additions and 15 deletions

View File

@ -23,11 +23,13 @@ import java.security.NoSuchAlgorithmException;
/** /**
* Miscellaneous methods for calculating digests. * Miscellaneous methods for calculating digests.
*
* <p>Mainly for internal use within the framework; consider * <p>Mainly for internal use within the framework; consider
* <a href="http://commons.apache.org/codec/">Apache Commons Codec</a> * <a href="http://commons.apache.org/codec/">Apache Commons Codec</a>
* for a more comprehensive suite of digest utilities. * for a more comprehensive suite of digest utilities.
* *
* @author Arjen Poutsma * @author Arjen Poutsma
* @author Juergen Hoeller
* @author Craig Andrews * @author Craig Andrews
* @since 3.0 * @since 3.0
*/ */
@ -49,8 +51,8 @@ public abstract class DigestUtils {
} }
/** /**
* Calculate the MD5 digest of the given InputStream. * Calculate the MD5 digest of the given stream.
* @param inputStream the inputStream to calculate the digest over * @param inputStream the InputStream to calculate the digest over
* @return the digest * @return the digest
* @since 4.2 * @since 4.2
*/ */
@ -59,8 +61,7 @@ public abstract class DigestUtils {
} }
/** /**
* Return a hexadecimal string representation of the MD5 digest of the given * Return a hexadecimal string representation of the MD5 digest of the given bytes.
* bytes.
* @param bytes the bytes to calculate the digest over * @param bytes the bytes to calculate the digest over
* @return a hexadecimal digest string * @return a hexadecimal digest string
*/ */
@ -69,9 +70,8 @@ public abstract class DigestUtils {
} }
/** /**
* Return a hexadecimal string representation of the MD5 digest of the given * Return a hexadecimal string representation of the MD5 digest of the given stream.
* inputStream. * @param inputStream the InputStream to calculate the digest over
* @param inputStream the inputStream to calculate the digest over
* @return a hexadecimal digest string * @return a hexadecimal digest string
* @since 4.2 * @since 4.2
*/ */
@ -127,7 +127,12 @@ public abstract class DigestUtils {
return messageDigest.digest(); return messageDigest.digest();
} }
else { else {
return messageDigest.digest(StreamUtils.copyToByteArray(inputStream)); final byte[] buffer = new byte[StreamUtils.BUFFER_SIZE];
int bytesRead = -1;
while ((bytesRead = inputStream.read(buffer)) != -1) {
messageDigest.update(buffer, 0, bytesRead);
}
return messageDigest.digest();
} }
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2015 the original author or authors. * Copyright 2002-2016 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -16,6 +16,8 @@
package org.springframework.util; package org.springframework.util;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import org.junit.Before; import org.junit.Before;
@ -25,6 +27,7 @@ import static org.junit.Assert.*;
/** /**
* @author Arjen Poutsma * @author Arjen Poutsma
* @author Juergen Hoeller
*/ */
public class DigestUtilsTests { public class DigestUtilsTests {
@ -38,24 +41,39 @@ public class DigestUtilsTests {
@Test @Test
public void md5() { public void md5() throws IOException {
byte[] result = DigestUtils.md5Digest(bytes);
byte[] expected = new byte[] byte[] expected = new byte[]
{-0x4f, 0xa, -0x73, -0x4f, 0x64, -0x20, 0x75, 0x41, 0x5, -0x49, -0x57, -0x65, -0x19, 0x2e, 0x3f, -0x1b}; {-0x4f, 0xa, -0x73, -0x4f, 0x64, -0x20, 0x75, 0x41, 0x5, -0x49, -0x57, -0x65, -0x19, 0x2e, 0x3f, -0x1b};
byte[] result = DigestUtils.md5Digest(bytes);
assertArrayEquals("Invalid hash", expected, result);
result = DigestUtils.md5Digest(new ByteArrayInputStream(bytes));
assertArrayEquals("Invalid hash", expected, result); assertArrayEquals("Invalid hash", expected, result);
} }
@Test @Test
public void md5Hex() throws UnsupportedEncodingException { public void md5Hex() throws IOException {
String expected = "b10a8db164e0754105b7a99be72e3fe5";
String hash = DigestUtils.md5DigestAsHex(bytes); String hash = DigestUtils.md5DigestAsHex(bytes);
assertEquals("Invalid hash", "b10a8db164e0754105b7a99be72e3fe5", hash); assertEquals("Invalid hash", expected, hash);
hash = DigestUtils.md5DigestAsHex(new ByteArrayInputStream(bytes));
assertEquals("Invalid hash", expected, hash);
} }
@Test @Test
public void md5StringBuilder() throws UnsupportedEncodingException { public void md5StringBuilder() throws IOException {
String expected = "b10a8db164e0754105b7a99be72e3fe5";
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();
DigestUtils.appendMd5DigestAsHex(bytes, builder); DigestUtils.appendMd5DigestAsHex(bytes, builder);
assertEquals("Invalid hash", "b10a8db164e0754105b7a99be72e3fe5", builder.toString()); assertEquals("Invalid hash", expected, builder.toString());
builder = new StringBuilder();
DigestUtils.appendMd5DigestAsHex(new ByteArrayInputStream(bytes), builder);
assertEquals("Invalid hash", expected, builder.toString());
} }
} }