|
1 | 1 | package datadog.trace.instrumentation.aws.v2.s3; |
2 | 2 |
|
3 | | -import software.amazon.awssdk.core.SdkRequest; |
| 3 | +import java.nio.charset.StandardCharsets; |
| 4 | +import java.security.MessageDigest; |
| 5 | +import java.security.NoSuchAlgorithmException; |
4 | 6 | import software.amazon.awssdk.core.interceptor.Context; |
5 | 7 | import software.amazon.awssdk.core.interceptor.ExecutionAttributes; |
6 | 8 | import software.amazon.awssdk.core.interceptor.ExecutionInterceptor; |
7 | 9 | import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadRequest; |
| 10 | +import software.amazon.awssdk.services.s3.model.CompleteMultipartUploadResponse; |
8 | 11 | import software.amazon.awssdk.services.s3.model.CopyObjectRequest; |
| 12 | +import software.amazon.awssdk.services.s3.model.CopyObjectResponse; |
9 | 13 | import software.amazon.awssdk.services.s3.model.PutObjectRequest; |
| 14 | +import software.amazon.awssdk.services.s3.model.PutObjectResponse; |
10 | 15 |
|
11 | 16 | public class S3Interceptor implements ExecutionInterceptor { |
| 17 | + // TODO wrap with try/catch |
12 | 18 | @Override |
13 | | - public SdkRequest modifyRequest( |
14 | | - Context.ModifyRequest context, ExecutionAttributes executionAttributes) { |
15 | | - if (context.request() instanceof PutObjectRequest) { |
16 | | - System.out.println("[DEBUG] PutObjectRequest"); |
17 | | - } else if (context.request() instanceof CopyObjectRequest) { |
18 | | - System.out.println("[DEBUG] CopyObjectRequest"); |
19 | | - } else if (context.request() instanceof CompleteMultipartUploadRequest) { |
20 | | - System.out.println("[DEBUG] CompleteMultipartUploadRequest"); |
| 19 | + public void afterExecution( |
| 20 | + Context.AfterExecution context, ExecutionAttributes executionAttributes) { |
| 21 | + String bucket, key, eTag; |
| 22 | + Object request = context.request(); |
| 23 | + Object response = context.response(); |
| 24 | + |
| 25 | + // https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3Client.html |
| 26 | + if (request instanceof PutObjectRequest) { |
| 27 | + PutObjectRequest putObjectRequest = (PutObjectRequest) request; |
| 28 | + bucket = putObjectRequest.bucket(); |
| 29 | + key = putObjectRequest.key(); |
| 30 | + eTag = ((PutObjectResponse) response).eTag(); |
| 31 | + } else if (request instanceof CopyObjectRequest) { |
| 32 | + CopyObjectRequest copyObjectRequest = (CopyObjectRequest) request; |
| 33 | + bucket = copyObjectRequest.destinationBucket(); |
| 34 | + key = copyObjectRequest.destinationKey(); |
| 35 | + eTag = ((CopyObjectResponse) response).copyObjectResult().eTag(); |
| 36 | + } else if (request instanceof CompleteMultipartUploadRequest) { |
| 37 | + CompleteMultipartUploadRequest completeMultipartUploadRequest = |
| 38 | + (CompleteMultipartUploadRequest) request; |
| 39 | + bucket = completeMultipartUploadRequest.bucket(); |
| 40 | + key = completeMultipartUploadRequest.key(); |
| 41 | + eTag = ((CompleteMultipartUploadResponse) response).eTag(); |
21 | 42 | } else { |
22 | | - System.out.println("[DEBUG] unknown request"); |
| 43 | + return; |
| 44 | + } |
| 45 | + |
| 46 | + if (eTag.startsWith("\"") && eTag.endsWith("\"")) { |
| 47 | + eTag = eTag.substring(1, eTag.length() - 1); |
23 | 48 | } |
| 49 | + System.out.printf("[DEBUG] bucket: %s, key: %s, eTag: %s%n", bucket, key, eTag); |
| 50 | + String hash = generatePointerHash(new String[] {bucket, key, eTag}); |
| 51 | + System.out.println("[DEBUG] hash: " + hash); |
| 52 | + } |
| 53 | + |
| 54 | + private static String generatePointerHash(String[] components) { |
| 55 | + try { |
| 56 | + byte[] hash = |
| 57 | + MessageDigest.getInstance("SHA-256") |
| 58 | + .digest(String.join("|", components).getBytes(StandardCharsets.UTF_8)); |
24 | 59 |
|
25 | | - return context.request(); |
| 60 | + StringBuilder hex = new StringBuilder(64); |
| 61 | + for (byte b : hash) { |
| 62 | + hex.append(String.format("%02x", b)); |
| 63 | + } |
| 64 | + return hex.substring(0, 32); |
| 65 | + } catch (NoSuchAlgorithmException e) { |
| 66 | + return ""; |
| 67 | + } |
26 | 68 | } |
27 | 69 | } |
0 commit comments