1 package com.github.davidmoten.aws.lw.client.internal.auth;
2
3 import java.io.ByteArrayInputStream;
4 import java.io.DataOutputStream;
5 import java.net.HttpURLConnection;
6 import java.net.URL;
7 import java.util.HashMap;
8 import java.util.Map;
9
10 import com.github.davidmoten.aws.lw.client.internal.util.Util;
11
12
13
14
15
16 public class PutS3ObjectChunkedSample {
17
18 private static final String contentSeed =
19 "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tortor metus, sagittis eget augue ut,\n"
20 + "feugiat vehicula risus. Integer tortor mauris, vehicula nec mollis et, consectetur eget tortor. In ut\n"
21 + "elit sagittis, ultrices est ut, iaculis turpis. In hac habitasse platea dictumst. Donec laoreet tellus\n"
22 + "at auctor tempus. Praesent nec diam sed urna sollicitudin vehicula eget id est. Vivamus sed laoreet\n"
23 + "lectus. Aliquam convallis condimentum risus, vitae porta justo venenatis vitae. Phasellus vitae nunc\n"
24 + "varius, volutpat quam nec, mollis urna. Donec tempus, nisi vitae gravida facilisis, sapien sem malesuada\n"
25 + "purus, id semper libero ipsum condimentum nulla. Suspendisse vel mi leo. Morbi pellentesque placerat congue.\n"
26 + "Nunc sollicitudin nunc diam, nec hendrerit dui commodo sed. Duis dapibus commodo elit, id commodo erat\n"
27 + "congue id. Aliquam erat volutpat.\n";
28
29
30
31
32 public static void putS3ObjectChunked(String bucketName, String regionName, String awsAccessKey, String awsSecretKey) {
33 System.out.println("***************************************************");
34 System.out.println("* Executing sample 'PutS3ObjectChunked' *");
35 System.out.println("***************************************************");
36
37
38
39 final int userDataBlockSize = 64 * 1024;
40 String sampleContent = make65KPayload();
41
42 URL endpointUrl;
43 if (regionName.equals("us-east-1")) {
44 endpointUrl = Util.toUrl("https://s3.amazonaws.com/" + bucketName + "/ExampleChunkedObject.txt");
45 } else {
46 endpointUrl = Util.toUrl("https://s3-" + regionName + ".amazonaws.com/" + bucketName + "/ExampleChunkedObject.txt");
47 }
48
49
50
51
52
53
54
55
56
57
58 Map<String, String> headers = new HashMap<String, String>();
59 headers.put("x-amz-storage-class", "REDUCED_REDUNDANCY");
60 headers.put("x-amz-content-sha256", Aws4SignerForChunkedUpload.STREAMING_BODY_SHA256);
61 headers.put("content-encoding", "" + "aws-chunked");
62 headers.put("x-amz-decoded-content-length", "" + sampleContent.length());
63
64 Aws4SignerForChunkedUpload signer = new Aws4SignerForChunkedUpload(
65 endpointUrl, "PUT", "s3", regionName);
66
67
68
69 long totalLength = Aws4SignerForChunkedUpload.calculateChunkedContentLength(sampleContent.length(), userDataBlockSize);
70 headers.put("content-length", "" + totalLength);
71
72 String authorization = signer.computeSignature(headers,
73 null,
74 Aws4SignerForChunkedUpload.STREAMING_BODY_SHA256,
75 awsAccessKey,
76 awsSecretKey);
77
78
79
80 headers.put("Authorization", authorization);
81
82
83
84
85
86
87
88 try {
89
90 HttpURLConnection connection = HttpUtils.createHttpConnection(endpointUrl, "PUT", headers);
91
92
93
94 byte[] buffer = new byte[userDataBlockSize];
95 DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
96
97
98 ByteArrayInputStream inputStream = new ByteArrayInputStream(sampleContent.getBytes("UTF-8"));
99
100 int bytesRead = 0;
101 while ( (bytesRead = inputStream.read(buffer, 0, buffer.length)) != -1 ) {
102
103 byte[] chunk = signer.constructSignedChunk(bytesRead, buffer);
104
105
106 outputStream.write(chunk);
107 outputStream.flush();
108 }
109
110
111 byte[] finalChunk = signer.constructSignedChunk(0, buffer);
112 outputStream.write(finalChunk);
113 outputStream.flush();
114 outputStream.close();
115
116
117 String response = HttpUtils.executeHttpRequest(connection);
118 System.out.println("--------- Response content ---------");
119 System.out.println(response);
120 System.out.println("------------------------------------");
121 } catch (Exception e) {
122 throw new RuntimeException("Error when sending chunked upload request. " + e.getMessage(), e);
123 }
124 }
125
126
127
128
129
130
131
132 private static String make65KPayload() {
133 StringBuilder oneKSeed = new StringBuilder();
134 while ( oneKSeed.length() < 1024 ) {
135 oneKSeed.append(contentSeed);
136 }
137
138
139 StringBuilder output = new StringBuilder();
140 for (int i = 0; i < 66; i++) {
141 output.append(oneKSeed);
142 }
143 return output.toString();
144 }
145 }