1/*
2* Copyright 2010-2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
3*
4* Licensed under the Apache License, Version 2.0 (the "License").
5* You may not use this file except in compliance with the License.
6* A copy of the License is located at
7*
8* http://aws.amazon.com/apache2.0
9*
10* or in the "license" file accompanying this file. This file is distributed
11* on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
12* express or implied. See the License for the specific language governing
13* permissions and limitations under the License.
14*/
15
16#include <aws/s3/model/GetObjectResult.h>
17#include <aws/core/AmazonWebServiceResult.h>
18#include <aws/core/utils/StringUtils.h>
19#include <aws/core/utils/HashingUtils.h>
20#include <aws/core/utils/memory/stl/AWSStringStream.h>
21
22#include <utility>
23
24using namespace Aws::S3::Model;
25using namespace Aws::Utils::Stream;
26using namespace Aws::Utils;
27using namespace Aws;
28
29GetObjectResult::GetObjectResult() :
30 m_deleteMarker(false),
31 m_contentLength(0),
32 m_missingMeta(0),
33 m_serverSideEncryption(ServerSideEncryption::NOT_SET),
34 m_storageClass(StorageClass::NOT_SET),
35 m_requestCharged(RequestCharged::NOT_SET),
36 m_replicationStatus(ReplicationStatus::NOT_SET),
37 m_partsCount(0),
38 m_tagCount(0),
39 m_objectLockMode(ObjectLockMode::NOT_SET),
40 m_objectLockLegalHoldStatus(ObjectLockLegalHoldStatus::NOT_SET)
41{
42}
43
44GetObjectResult::GetObjectResult(GetObjectResult&& toMove) :
45 m_body(std::move(toMove.m_body)),
46 m_deleteMarker(toMove.m_deleteMarker),
47 m_acceptRanges(std::move(toMove.m_acceptRanges)),
48 m_expiration(std::move(toMove.m_expiration)),
49 m_restore(std::move(toMove.m_restore)),
50 m_lastModified(std::move(toMove.m_lastModified)),
51 m_contentLength(toMove.m_contentLength),
52 m_eTag(std::move(toMove.m_eTag)),
53 m_missingMeta(toMove.m_missingMeta),
54 m_versionId(std::move(toMove.m_versionId)),
55 m_cacheControl(std::move(toMove.m_cacheControl)),
56 m_contentDisposition(std::move(toMove.m_contentDisposition)),
57 m_contentEncoding(std::move(toMove.m_contentEncoding)),
58 m_contentLanguage(std::move(toMove.m_contentLanguage)),
59 m_contentRange(std::move(toMove.m_contentRange)),
60 m_contentType(std::move(toMove.m_contentType)),
61 m_expires(std::move(toMove.m_expires)),
62 m_websiteRedirectLocation(std::move(toMove.m_websiteRedirectLocation)),
63 m_serverSideEncryption(toMove.m_serverSideEncryption),
64 m_metadata(std::move(toMove.m_metadata)),
65 m_sSECustomerAlgorithm(std::move(toMove.m_sSECustomerAlgorithm)),
66 m_sSECustomerKeyMD5(std::move(toMove.m_sSECustomerKeyMD5)),
67 m_sSEKMSKeyId(std::move(toMove.m_sSEKMSKeyId)),
68 m_storageClass(toMove.m_storageClass),
69 m_requestCharged(toMove.m_requestCharged),
70 m_replicationStatus(toMove.m_replicationStatus),
71 m_partsCount(toMove.m_partsCount),
72 m_tagCount(toMove.m_tagCount),
73 m_objectLockMode(toMove.m_objectLockMode),
74 m_objectLockRetainUntilDate(std::move(toMove.m_objectLockRetainUntilDate)),
75 m_objectLockLegalHoldStatus(toMove.m_objectLockLegalHoldStatus),
76 m_id2(std::move(toMove.m_id2)),
77 m_requestId(std::move(toMove.m_requestId))
78{
79}
80
81GetObjectResult& GetObjectResult::operator=(GetObjectResult&& toMove)
82{
83 if(this == &toMove)
84 {
85 return *this;
86 }
87
88 m_body = std::move(toMove.m_body);
89 m_deleteMarker = toMove.m_deleteMarker;
90 m_acceptRanges = std::move(toMove.m_acceptRanges);
91 m_expiration = std::move(toMove.m_expiration);
92 m_restore = std::move(toMove.m_restore);
93 m_lastModified = std::move(toMove.m_lastModified);
94 m_contentLength = toMove.m_contentLength;
95 m_eTag = std::move(toMove.m_eTag);
96 m_missingMeta = toMove.m_missingMeta;
97 m_versionId = std::move(toMove.m_versionId);
98 m_cacheControl = std::move(toMove.m_cacheControl);
99 m_contentDisposition = std::move(toMove.m_contentDisposition);
100 m_contentEncoding = std::move(toMove.m_contentEncoding);
101 m_contentLanguage = std::move(toMove.m_contentLanguage);
102 m_contentRange = std::move(toMove.m_contentRange);
103 m_contentType = std::move(toMove.m_contentType);
104 m_expires = std::move(toMove.m_expires);
105 m_websiteRedirectLocation = std::move(toMove.m_websiteRedirectLocation);
106 m_serverSideEncryption = toMove.m_serverSideEncryption;
107 m_metadata = std::move(toMove.m_metadata);
108 m_sSECustomerAlgorithm = std::move(toMove.m_sSECustomerAlgorithm);
109 m_sSECustomerKeyMD5 = std::move(toMove.m_sSECustomerKeyMD5);
110 m_sSEKMSKeyId = std::move(toMove.m_sSEKMSKeyId);
111 m_storageClass = toMove.m_storageClass;
112 m_requestCharged = toMove.m_requestCharged;
113 m_replicationStatus = toMove.m_replicationStatus;
114 m_partsCount = toMove.m_partsCount;
115 m_tagCount = toMove.m_tagCount;
116 m_objectLockMode = toMove.m_objectLockMode;
117 m_objectLockRetainUntilDate = std::move(toMove.m_objectLockRetainUntilDate);
118 m_objectLockLegalHoldStatus = toMove.m_objectLockLegalHoldStatus;
119 m_id2 = std::move(toMove.m_id2);
120 m_requestId = std::move(toMove.m_requestId);
121
122 return *this;
123}
124
125GetObjectResult::GetObjectResult(Aws::AmazonWebServiceResult<ResponseStream>&& result) :
126 m_deleteMarker(false),
127 m_contentLength(0),
128 m_missingMeta(0),
129 m_serverSideEncryption(ServerSideEncryption::NOT_SET),
130 m_storageClass(StorageClass::NOT_SET),
131 m_requestCharged(RequestCharged::NOT_SET),
132 m_replicationStatus(ReplicationStatus::NOT_SET),
133 m_partsCount(0),
134 m_tagCount(0),
135 m_objectLockMode(ObjectLockMode::NOT_SET),
136 m_objectLockLegalHoldStatus(ObjectLockLegalHoldStatus::NOT_SET)
137{
138 *this = std::move(result);
139}
140
141GetObjectResult& GetObjectResult::operator =(Aws::AmazonWebServiceResult<ResponseStream>&& result)
142{
143 m_body = result.TakeOwnershipOfPayload();
144
145 const auto& headers = result.GetHeaderValueCollection();
146 const auto& deleteMarkerIter = headers.find("x-amz-delete-marker");
147 if(deleteMarkerIter != headers.end())
148 {
149 m_deleteMarker = StringUtils::ConvertToBool(deleteMarkerIter->second.c_str());
150 }
151
152 const auto& acceptRangesIter = headers.find("accept-ranges");
153 if(acceptRangesIter != headers.end())
154 {
155 m_acceptRanges = acceptRangesIter->second;
156 }
157
158 const auto& expirationIter = headers.find("x-amz-expiration");
159 if(expirationIter != headers.end())
160 {
161 m_expiration = expirationIter->second;
162 }
163
164 const auto& restoreIter = headers.find("x-amz-restore");
165 if(restoreIter != headers.end())
166 {
167 m_restore = restoreIter->second;
168 }
169
170 const auto& lastModifiedIter = headers.find("last-modified");
171 if(lastModifiedIter != headers.end())
172 {
173 m_lastModified = DateTime(lastModifiedIter->second, DateFormat::RFC822);
174 }
175
176 const auto& contentLengthIter = headers.find("content-length");
177 if(contentLengthIter != headers.end())
178 {
179 m_contentLength = StringUtils::ConvertToInt64(contentLengthIter->second.c_str());
180 }
181
182 const auto& eTagIter = headers.find("etag");
183 if(eTagIter != headers.end())
184 {
185 m_eTag = eTagIter->second;
186 }
187
188 const auto& missingMetaIter = headers.find("x-amz-missing-meta");
189 if(missingMetaIter != headers.end())
190 {
191 m_missingMeta = StringUtils::ConvertToInt32(missingMetaIter->second.c_str());
192 }
193
194 const auto& versionIdIter = headers.find("x-amz-version-id");
195 if(versionIdIter != headers.end())
196 {
197 m_versionId = versionIdIter->second;
198 }
199
200 const auto& cacheControlIter = headers.find("cache-control");
201 if(cacheControlIter != headers.end())
202 {
203 m_cacheControl = cacheControlIter->second;
204 }
205
206 const auto& contentDispositionIter = headers.find("content-disposition");
207 if(contentDispositionIter != headers.end())
208 {
209 m_contentDisposition = contentDispositionIter->second;
210 }
211
212 const auto& contentEncodingIter = headers.find("content-encoding");
213 if(contentEncodingIter != headers.end())
214 {
215 m_contentEncoding = contentEncodingIter->second;
216 }
217
218 const auto& contentLanguageIter = headers.find("content-language");
219 if(contentLanguageIter != headers.end())
220 {
221 m_contentLanguage = contentLanguageIter->second;
222 }
223
224 const auto& contentRangeIter = headers.find("content-range");
225 if(contentRangeIter != headers.end())
226 {
227 m_contentRange = contentRangeIter->second;
228 }
229
230 const auto& contentTypeIter = headers.find("content-type");
231 if(contentTypeIter != headers.end())
232 {
233 m_contentType = contentTypeIter->second;
234 }
235
236 const auto& expiresIter = headers.find("expires");
237 if(expiresIter != headers.end())
238 {
239 m_expires = DateTime(expiresIter->second, DateFormat::RFC822);
240 }
241
242 const auto& websiteRedirectLocationIter = headers.find("x-amz-website-redirect-location");
243 if(websiteRedirectLocationIter != headers.end())
244 {
245 m_websiteRedirectLocation = websiteRedirectLocationIter->second;
246 }
247
248 const auto& serverSideEncryptionIter = headers.find("x-amz-server-side-encryption");
249 if(serverSideEncryptionIter != headers.end())
250 {
251 m_serverSideEncryption = ServerSideEncryptionMapper::GetServerSideEncryptionForName(serverSideEncryptionIter->second);
252 }
253
254 std::size_t prefixSize = sizeof("x-amz-meta-") - 1; //subtract the NULL terminator out
255 for(const auto& item : headers)
256 {
257 std::size_t foundPrefix = item.first.find("x-amz-meta-");
258
259 if(foundPrefix != std::string::npos)
260 {
261 m_metadata[item.first.substr(prefixSize)] = item.second;
262 }
263 }
264
265 const auto& sSECustomerAlgorithmIter = headers.find("x-amz-server-side-encryption-customer-algorithm");
266 if(sSECustomerAlgorithmIter != headers.end())
267 {
268 m_sSECustomerAlgorithm = sSECustomerAlgorithmIter->second;
269 }
270
271 const auto& sSECustomerKeyMD5Iter = headers.find("x-amz-server-side-encryption-customer-key-md5");
272 if(sSECustomerKeyMD5Iter != headers.end())
273 {
274 m_sSECustomerKeyMD5 = sSECustomerKeyMD5Iter->second;
275 }
276
277 const auto& sSEKMSKeyIdIter = headers.find("x-amz-server-side-encryption-aws-kms-key-id");
278 if(sSEKMSKeyIdIter != headers.end())
279 {
280 m_sSEKMSKeyId = sSEKMSKeyIdIter->second;
281 }
282
283 const auto& storageClassIter = headers.find("x-amz-storage-class");
284 if(storageClassIter != headers.end())
285 {
286 m_storageClass = StorageClassMapper::GetStorageClassForName(storageClassIter->second);
287 }
288
289 const auto& requestChargedIter = headers.find("x-amz-request-charged");
290 if(requestChargedIter != headers.end())
291 {
292 m_requestCharged = RequestChargedMapper::GetRequestChargedForName(requestChargedIter->second);
293 }
294
295 const auto& replicationStatusIter = headers.find("x-amz-replication-status");
296 if(replicationStatusIter != headers.end())
297 {
298 m_replicationStatus = ReplicationStatusMapper::GetReplicationStatusForName(replicationStatusIter->second);
299 }
300
301 const auto& partsCountIter = headers.find("x-amz-mp-parts-count");
302 if(partsCountIter != headers.end())
303 {
304 m_partsCount = StringUtils::ConvertToInt32(partsCountIter->second.c_str());
305 }
306
307 const auto& tagCountIter = headers.find("x-amz-tagging-count");
308 if(tagCountIter != headers.end())
309 {
310 m_tagCount = StringUtils::ConvertToInt32(tagCountIter->second.c_str());
311 }
312
313 const auto& objectLockModeIter = headers.find("x-amz-object-lock-mode");
314 if(objectLockModeIter != headers.end())
315 {
316 m_objectLockMode = ObjectLockModeMapper::GetObjectLockModeForName(objectLockModeIter->second);
317 }
318
319 const auto& objectLockRetainUntilDateIter = headers.find("x-amz-object-lock-retain-until-date");
320 if(objectLockRetainUntilDateIter != headers.end())
321 {
322 m_objectLockRetainUntilDate = DateTime(objectLockRetainUntilDateIter->second, DateFormat::RFC822);
323 }
324
325 const auto& objectLockLegalHoldStatusIter = headers.find("x-amz-object-lock-legal-hold");
326 if(objectLockLegalHoldStatusIter != headers.end())
327 {
328 m_objectLockLegalHoldStatus = ObjectLockLegalHoldStatusMapper::GetObjectLockLegalHoldStatusForName(objectLockLegalHoldStatusIter->second);
329 }
330
331 const auto& id2Iter = headers.find("x-amz-id-2");
332 if(id2Iter != headers.end())
333 {
334 m_id2 = id2Iter->second;
335 }
336
337 const auto& requestIdIter = headers.find("x-amz-request-id");
338 if(requestIdIter != headers.end())
339 {
340 m_requestId = requestIdIter->second;
341 }
342
343 return *this;
344}
345