1 /**
2  * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3  * SPDX-License-Identifier: Apache-2.0.
4  */
5 
6 #include <aws/s3-crt/model/WriteGetObjectResponseRequest.h>
7 #include <aws/core/AmazonWebServiceResult.h>
8 #include <aws/core/http/URI.h>
9 #include <aws/core/utils/memory/stl/AWSStringStream.h>
10 #include <aws/core/utils/HashingUtils.h>
11 
12 #include <utility>
13 
14 using namespace Aws::S3Crt::Model;
15 using namespace Aws::Utils::Stream;
16 using namespace Aws::Utils;
17 using namespace Aws::Http;
18 using namespace Aws;
19 
WriteGetObjectResponseRequest()20 WriteGetObjectResponseRequest::WriteGetObjectResponseRequest() :
21     m_requestRouteHasBeenSet(false),
22     m_requestTokenHasBeenSet(false),
23     m_statusCode(0),
24     m_statusCodeHasBeenSet(false),
25     m_errorCodeHasBeenSet(false),
26     m_errorMessageHasBeenSet(false),
27     m_acceptRangesHasBeenSet(false),
28     m_cacheControlHasBeenSet(false),
29     m_contentDispositionHasBeenSet(false),
30     m_contentEncodingHasBeenSet(false),
31     m_contentLanguageHasBeenSet(false),
32     m_contentLength(0),
33     m_contentLengthHasBeenSet(false),
34     m_contentRangeHasBeenSet(false),
35     m_deleteMarker(false),
36     m_deleteMarkerHasBeenSet(false),
37     m_eTagHasBeenSet(false),
38     m_expiresHasBeenSet(false),
39     m_expirationHasBeenSet(false),
40     m_lastModifiedHasBeenSet(false),
41     m_missingMeta(0),
42     m_missingMetaHasBeenSet(false),
43     m_metadataHasBeenSet(false),
44     m_objectLockMode(ObjectLockMode::NOT_SET),
45     m_objectLockModeHasBeenSet(false),
46     m_objectLockLegalHoldStatus(ObjectLockLegalHoldStatus::NOT_SET),
47     m_objectLockLegalHoldStatusHasBeenSet(false),
48     m_objectLockRetainUntilDateHasBeenSet(false),
49     m_partsCount(0),
50     m_partsCountHasBeenSet(false),
51     m_replicationStatus(ReplicationStatus::NOT_SET),
52     m_replicationStatusHasBeenSet(false),
53     m_requestCharged(RequestCharged::NOT_SET),
54     m_requestChargedHasBeenSet(false),
55     m_restoreHasBeenSet(false),
56     m_serverSideEncryption(ServerSideEncryption::NOT_SET),
57     m_serverSideEncryptionHasBeenSet(false),
58     m_sSECustomerAlgorithmHasBeenSet(false),
59     m_sSEKMSKeyIdHasBeenSet(false),
60     m_sSECustomerKeyMD5HasBeenSet(false),
61     m_storageClass(StorageClass::NOT_SET),
62     m_storageClassHasBeenSet(false),
63     m_tagCount(0),
64     m_tagCountHasBeenSet(false),
65     m_versionIdHasBeenSet(false),
66     m_bucketKeyEnabled(false),
67     m_bucketKeyEnabledHasBeenSet(false),
68     m_customizedAccessLogTagHasBeenSet(false)
69 {
70 }
71 
72 
AddQueryStringParameters(URI & uri) const73 void WriteGetObjectResponseRequest::AddQueryStringParameters(URI& uri) const
74 {
75     Aws::StringStream ss;
76     if(!m_customizedAccessLogTag.empty())
77     {
78         // only accept customized LogTag which starts with "x-"
79         Aws::Map<Aws::String, Aws::String> collectedLogTags;
80         for(const auto& entry: m_customizedAccessLogTag)
81         {
82             if (!entry.first.empty() && !entry.second.empty() && entry.first.substr(0, 2) == "x-")
83             {
84                 collectedLogTags.emplace(entry.first, entry.second);
85             }
86         }
87 
88         if (!collectedLogTags.empty())
89         {
90             uri.AddQueryStringParameter(collectedLogTags);
91         }
92     }
93 }
94 
GetRequestSpecificHeaders() const95 Aws::Http::HeaderValueCollection WriteGetObjectResponseRequest::GetRequestSpecificHeaders() const
96 {
97   Aws::Http::HeaderValueCollection headers;
98   Aws::StringStream ss;
99   if(m_requestRouteHasBeenSet)
100   {
101     ss << m_requestRoute;
102     headers.emplace("x-amz-request-route",  ss.str());
103     ss.str("");
104   }
105 
106   if(m_requestTokenHasBeenSet)
107   {
108     ss << m_requestToken;
109     headers.emplace("x-amz-request-token",  ss.str());
110     ss.str("");
111   }
112 
113   if(m_statusCodeHasBeenSet)
114   {
115     ss << m_statusCode;
116     headers.emplace("x-amz-fwd-status",  ss.str());
117     ss.str("");
118   }
119 
120   if(m_errorCodeHasBeenSet)
121   {
122     ss << m_errorCode;
123     headers.emplace("x-amz-fwd-error-code",  ss.str());
124     ss.str("");
125   }
126 
127   if(m_errorMessageHasBeenSet)
128   {
129     ss << m_errorMessage;
130     headers.emplace("x-amz-fwd-error-message",  ss.str());
131     ss.str("");
132   }
133 
134   if(m_acceptRangesHasBeenSet)
135   {
136     ss << m_acceptRanges;
137     headers.emplace("x-amz-fwd-header-accept-ranges",  ss.str());
138     ss.str("");
139   }
140 
141   if(m_cacheControlHasBeenSet)
142   {
143     ss << m_cacheControl;
144     headers.emplace("x-amz-fwd-header-cache-control",  ss.str());
145     ss.str("");
146   }
147 
148   if(m_contentDispositionHasBeenSet)
149   {
150     ss << m_contentDisposition;
151     headers.emplace("x-amz-fwd-header-content-disposition",  ss.str());
152     ss.str("");
153   }
154 
155   if(m_contentEncodingHasBeenSet)
156   {
157     ss << m_contentEncoding;
158     headers.emplace("x-amz-fwd-header-content-encoding",  ss.str());
159     ss.str("");
160   }
161 
162   if(m_contentLanguageHasBeenSet)
163   {
164     ss << m_contentLanguage;
165     headers.emplace("x-amz-fwd-header-content-language",  ss.str());
166     ss.str("");
167   }
168 
169   if(m_contentLengthHasBeenSet)
170   {
171     ss << m_contentLength;
172     headers.emplace("content-length",  ss.str());
173     ss.str("");
174   }
175 
176   if(m_contentRangeHasBeenSet)
177   {
178     ss << m_contentRange;
179     headers.emplace("x-amz-fwd-header-content-range",  ss.str());
180     ss.str("");
181   }
182 
183   if(m_deleteMarkerHasBeenSet)
184   {
185     ss << std::boolalpha << m_deleteMarker;
186     headers.emplace("x-amz-fwd-header-x-amz-delete-marker", ss.str());
187     ss.str("");
188   }
189 
190   if(m_eTagHasBeenSet)
191   {
192     ss << m_eTag;
193     headers.emplace("x-amz-fwd-header-etag",  ss.str());
194     ss.str("");
195   }
196 
197   if(m_expiresHasBeenSet)
198   {
199     headers.emplace("x-amz-fwd-header-expires", m_expires.ToGmtString(DateFormat::RFC822));
200   }
201 
202   if(m_expirationHasBeenSet)
203   {
204     ss << m_expiration;
205     headers.emplace("x-amz-fwd-header-x-amz-expiration",  ss.str());
206     ss.str("");
207   }
208 
209   if(m_lastModifiedHasBeenSet)
210   {
211     headers.emplace("x-amz-fwd-header-last-modified", m_lastModified.ToGmtString(DateFormat::RFC822));
212   }
213 
214   if(m_missingMetaHasBeenSet)
215   {
216     ss << m_missingMeta;
217     headers.emplace("x-amz-fwd-header-x-amz-missing-meta",  ss.str());
218     ss.str("");
219   }
220 
221   if(m_metadataHasBeenSet)
222   {
223     for(const auto& item : m_metadata)
224     {
225       ss << "x-amz-meta-" << item.first;
226       headers.emplace(ss.str(), item.second);
227       ss.str("");
228     }
229   }
230 
231   if(m_objectLockModeHasBeenSet)
232   {
233     headers.emplace("x-amz-fwd-header-x-amz-object-lock-mode", ObjectLockModeMapper::GetNameForObjectLockMode(m_objectLockMode));
234   }
235 
236   if(m_objectLockLegalHoldStatusHasBeenSet)
237   {
238     headers.emplace("x-amz-fwd-header-x-amz-object-lock-legal-hold", ObjectLockLegalHoldStatusMapper::GetNameForObjectLockLegalHoldStatus(m_objectLockLegalHoldStatus));
239   }
240 
241   if(m_objectLockRetainUntilDateHasBeenSet)
242   {
243     headers.emplace("x-amz-fwd-header-x-amz-object-lock-retain-until-date", m_objectLockRetainUntilDate.ToGmtString(DateFormat::ISO_8601));
244   }
245 
246   if(m_partsCountHasBeenSet)
247   {
248     ss << m_partsCount;
249     headers.emplace("x-amz-fwd-header-x-amz-mp-parts-count",  ss.str());
250     ss.str("");
251   }
252 
253   if(m_replicationStatusHasBeenSet)
254   {
255     headers.emplace("x-amz-fwd-header-x-amz-replication-status", ReplicationStatusMapper::GetNameForReplicationStatus(m_replicationStatus));
256   }
257 
258   if(m_requestChargedHasBeenSet)
259   {
260     headers.emplace("x-amz-fwd-header-x-amz-request-charged", RequestChargedMapper::GetNameForRequestCharged(m_requestCharged));
261   }
262 
263   if(m_restoreHasBeenSet)
264   {
265     ss << m_restore;
266     headers.emplace("x-amz-fwd-header-x-amz-restore",  ss.str());
267     ss.str("");
268   }
269 
270   if(m_serverSideEncryptionHasBeenSet)
271   {
272     headers.emplace("x-amz-fwd-header-x-amz-server-side-encryption", ServerSideEncryptionMapper::GetNameForServerSideEncryption(m_serverSideEncryption));
273   }
274 
275   if(m_sSECustomerAlgorithmHasBeenSet)
276   {
277     ss << m_sSECustomerAlgorithm;
278     headers.emplace("x-amz-fwd-header-x-amz-server-side-encryption-customer-algorithm",  ss.str());
279     ss.str("");
280   }
281 
282   if(m_sSEKMSKeyIdHasBeenSet)
283   {
284     ss << m_sSEKMSKeyId;
285     headers.emplace("x-amz-fwd-header-x-amz-server-side-encryption-aws-kms-key-id",  ss.str());
286     ss.str("");
287   }
288 
289   if(m_sSECustomerKeyMD5HasBeenSet)
290   {
291     ss << m_sSECustomerKeyMD5;
292     headers.emplace("x-amz-fwd-header-x-amz-server-side-encryption-customer-key-md5",  ss.str());
293     ss.str("");
294   }
295 
296   if(m_storageClassHasBeenSet)
297   {
298     headers.emplace("x-amz-fwd-header-x-amz-storage-class", StorageClassMapper::GetNameForStorageClass(m_storageClass));
299   }
300 
301   if(m_tagCountHasBeenSet)
302   {
303     ss << m_tagCount;
304     headers.emplace("x-amz-fwd-header-x-amz-tagging-count",  ss.str());
305     ss.str("");
306   }
307 
308   if(m_versionIdHasBeenSet)
309   {
310     ss << m_versionId;
311     headers.emplace("x-amz-fwd-header-x-amz-version-id",  ss.str());
312     ss.str("");
313   }
314 
315   if(m_bucketKeyEnabledHasBeenSet)
316   {
317     ss << std::boolalpha << m_bucketKeyEnabled;
318     headers.emplace("x-amz-fwd-header-x-amz-server-side-encryption-bucket-key-enabled", ss.str());
319     ss.str("");
320   }
321 
322   return headers;
323 
324 }
325