|
27 | 27 | import org.elasticsearch.common.blobstore.BlobPath; |
28 | 28 | import org.elasticsearch.common.blobstore.OperationPurpose; |
29 | 29 | import org.elasticsearch.common.blobstore.OptionalBytesReference; |
| 30 | +import org.elasticsearch.common.bytes.BytesArray; |
30 | 31 | import org.elasticsearch.common.bytes.BytesReference; |
31 | 32 | import org.elasticsearch.common.hash.MessageDigests; |
32 | 33 | import org.elasticsearch.common.io.Streams; |
|
45 | 46 | import org.elasticsearch.core.SuppressForbidden; |
46 | 47 | import org.elasticsearch.core.TimeValue; |
47 | 48 | import org.elasticsearch.env.Environment; |
48 | | -import org.elasticsearch.logging.LogManager; |
49 | | -import org.elasticsearch.logging.Logger; |
50 | 49 | import org.elasticsearch.repositories.RepositoriesMetrics; |
51 | 50 | import org.elasticsearch.repositories.blobstore.AbstractBlobContainerRetriesTestCase; |
52 | 51 | import org.elasticsearch.repositories.blobstore.BlobStoreTestUtil; |
|
73 | 72 | import java.net.UnknownHostException; |
74 | 73 | import java.nio.charset.StandardCharsets; |
75 | 74 | import java.nio.file.NoSuchFileException; |
76 | | -import java.security.MessageDigest; |
77 | 75 | import java.util.ArrayList; |
78 | 76 | import java.util.Arrays; |
79 | 77 | import java.util.List; |
@@ -379,13 +377,12 @@ public void testWriteLargeBlob() throws Exception { |
379 | 377 | } |
380 | 378 | } else if (s3Request.isUploadPartRequest()) { |
381 | 379 | // upload part request |
382 | | - MD5DigestCalculatingInputStream md5 = new MD5DigestCalculatingInputStream(exchange.getRequestBody()); |
383 | | - BytesReference bytes = Streams.readFully(md5); |
| 380 | + BytesReference bytes = Streams.readFully(exchange.getRequestBody()); |
384 | 381 | assertThat((long) bytes.length(), anyOf(equalTo(lastPartSize), equalTo(bufferSize.getBytes()))); |
385 | 382 | assertThat(contentLength, anyOf(equalTo(lastPartSize), equalTo(bufferSize.getBytes()))); |
386 | 383 |
|
387 | 384 | if (countDownUploads.decrementAndGet() % 2 == 0) { |
388 | | - exchange.getResponseHeaders().add("ETag", md5.getBase16Md5Digest()); |
| 385 | + exchange.getResponseHeaders().add("ETag", getBase16MD5Digest(bytes)); |
389 | 386 | exchange.sendResponseHeaders(HttpStatus.SC_OK, -1); |
390 | 387 | exchange.close(); |
391 | 388 | return; |
@@ -477,12 +474,11 @@ public void testWriteLargeBlobStreaming() throws Exception { |
477 | 474 | } |
478 | 475 | } else if (s3Request.isUploadPartRequest()) { |
479 | 476 | // upload part request |
480 | | - MD5DigestCalculatingInputStream md5 = new MD5DigestCalculatingInputStream(exchange.getRequestBody()); |
481 | | - BytesReference bytes = Streams.readFully(md5); |
| 477 | + BytesReference bytes = Streams.readFully(exchange.getRequestBody()); |
482 | 478 |
|
483 | 479 | if (counterUploads.incrementAndGet() % 2 == 0) { |
484 | 480 | bytesReceived.addAndGet(bytes.length()); |
485 | | - exchange.getResponseHeaders().add("ETag", md5.getBase16Md5Digest()); |
| 481 | + exchange.getResponseHeaders().add("ETag", getBase16MD5Digest(bytes)); |
486 | 482 | exchange.sendResponseHeaders(HttpStatus.SC_OK, -1); |
487 | 483 | exchange.close(); |
488 | 484 | return; |
@@ -1125,19 +1121,19 @@ public void testTrimmedLogAndCappedSuppressedErrorOnMultiObjectDeletionException |
1125 | 1121 | } |
1126 | 1122 | } |
1127 | 1123 |
|
1128 | | - public void testMd5DigestCalculatingInputStream() throws IOException { |
1129 | | - // from Wikipedia |
1130 | | - doMD5DigestCalculatingInputStreamTest("", "d41d8cd98f00b204e9800998ecf8427e"); |
1131 | | - doMD5DigestCalculatingInputStreamTest("The quick brown fox jumps over the lazy dog", "9e107d9d372bb6826bd81d3542a419d6"); |
1132 | | - doMD5DigestCalculatingInputStreamTest("The quick brown fox jumps over the lazy dog.", "e4d909c290d0fb1ca068ffaddf22cbd0"); |
| 1124 | + private static String getBase16MD5Digest(BytesReference bytesReference) { |
| 1125 | + return MessageDigests.toHexString(MessageDigests.digest(bytesReference, MessageDigests.md5())); |
1133 | 1126 | } |
1134 | 1127 |
|
1135 | | - private static void doMD5DigestCalculatingInputStreamTest(String input, String expectedDigestString) throws IOException { |
1136 | | - final var bytes = input.getBytes(StandardCharsets.UTF_8); |
1137 | | - try (var s = new ByteArrayInputStream(bytes); var m = new MD5DigestCalculatingInputStream(s)) { |
1138 | | - assertArrayEquals(bytes, m.readAllBytes()); |
1139 | | - assertEquals(expectedDigestString, m.getBase16Md5Digest()); |
1140 | | - } |
| 1128 | + public void testGetBase16MD5Digest() { |
| 1129 | + // from Wikipedia, see also org.elasticsearch.common.hash.MessageDigestsTests.testMd5 |
| 1130 | + assertBase16MD5Digest("", "d41d8cd98f00b204e9800998ecf8427e"); |
| 1131 | + assertBase16MD5Digest("The quick brown fox jumps over the lazy dog", "9e107d9d372bb6826bd81d3542a419d6"); |
| 1132 | + assertBase16MD5Digest("The quick brown fox jumps over the lazy dog.", "e4d909c290d0fb1ca068ffaddf22cbd0"); |
| 1133 | + } |
| 1134 | + |
| 1135 | + private static void assertBase16MD5Digest(String input, String expectedDigestString) { |
| 1136 | + assertEquals(expectedDigestString, getBase16MD5Digest(new BytesArray(input))); |
1141 | 1137 | } |
1142 | 1138 |
|
1143 | 1139 | @Override |
@@ -1289,45 +1285,4 @@ public void close() throws IOException { |
1289 | 1285 | } |
1290 | 1286 | } |
1291 | 1287 | } |
1292 | | - |
1293 | | - private static final Logger logger = LogManager.getLogger(S3BlobContainerRetriesTests.class); |
1294 | | - |
1295 | | - private static class MD5DigestCalculatingInputStream extends InputStream { |
1296 | | - |
1297 | | - private final MessageDigest messageDigest = MessageDigests.md5(); |
1298 | | - private final InputStream delegate; |
1299 | | - |
1300 | | - private MD5DigestCalculatingInputStream(InputStream delegate) { |
1301 | | - this.delegate = delegate; |
1302 | | - } |
1303 | | - |
1304 | | - @Override |
1305 | | - public int read() throws IOException { |
1306 | | - final var b = delegate.read(); |
1307 | | - if (b >= 0) { |
1308 | | - messageDigest.update((byte) b); |
1309 | | - } |
1310 | | - return b; |
1311 | | - } |
1312 | | - |
1313 | | - @Override |
1314 | | - public int read(byte[] b, int off, int len) throws IOException { |
1315 | | - final var readLen = delegate.read(b, off, len); |
1316 | | - if (readLen > 0) { |
1317 | | - messageDigest.update(b, off, readLen); |
1318 | | - } |
1319 | | - return readLen; |
1320 | | - } |
1321 | | - |
1322 | | - public String getBase16Md5Digest() { |
1323 | | - final var digestBytes = messageDigest.digest(); |
1324 | | - final var stringChars = new char[digestBytes.length * 2]; |
1325 | | - for (int i = 0; i < digestBytes.length; i++) { |
1326 | | - final var digestByte = digestBytes[i]; |
1327 | | - stringChars[2 * i] = Character.forDigit((digestByte >> 4) & 0xF, 16); |
1328 | | - stringChars[2 * i + 1] = Character.forDigit(digestByte & 0xF, 16); |
1329 | | - } |
1330 | | - return new String(stringChars); |
1331 | | - } |
1332 | | - } |
1333 | 1288 | } |
0 commit comments