AWS SDK for C++

AWS SDK for C++ Version 1.11.717

Loading...
Searching...
No Matches
HeadObjectRequest.h
1
6#pragma once
7#include <aws/core/utils/DateTime.h>
8#include <aws/core/utils/memory/stl/AWSMap.h>
9#include <aws/core/utils/memory/stl/AWSString.h>
10#include <aws/s3/S3Request.h>
11#include <aws/s3/S3_EXPORTS.h>
12#include <aws/s3/model/ChecksumMode.h>
13#include <aws/s3/model/RequestPayer.h>
14
15#include <utility>
16
17namespace Aws {
18namespace Http {
19class URI;
20} // namespace Http
21namespace S3 {
22namespace Model {
23
27 public:
28 AWS_S3_API HeadObjectRequest() = default;
29
30 // Service request name is the Operation name which will send this request out,
31 // each operation should has unique request name, so that we can get operation's name from this request.
32 // Note: this is not true for response, multiple operations may have the same response name,
33 // so we can not get operation's name from response.
34 inline virtual const char* GetServiceRequestName() const override { return "HeadObject"; }
35
36 AWS_S3_API Aws::String SerializePayload() const override;
37
38 AWS_S3_API void AddQueryStringParameters(Aws::Http::URI& uri) const override;
39
41
42 AWS_S3_API bool HasEmbeddedError(IOStream& body, const Http::HeaderValueCollection& header) const override;
46 AWS_S3_API EndpointParameters GetEndpointContextParams() const override;
47
49
84 inline const Aws::String& GetBucket() const { return m_bucket; }
85 inline bool BucketHasBeenSet() const { return m_bucketHasBeenSet; }
86 template <typename BucketT = Aws::String>
87 void SetBucket(BucketT&& value) {
88 m_bucketHasBeenSet = true;
89 m_bucket = std::forward<BucketT>(value);
90 }
91 template <typename BucketT = Aws::String>
92 HeadObjectRequest& WithBucket(BucketT&& value) {
93 SetBucket(std::forward<BucketT>(value));
94 return *this;
95 }
97
99
110 inline const Aws::String& GetIfMatch() const { return m_ifMatch; }
111 inline bool IfMatchHasBeenSet() const { return m_ifMatchHasBeenSet; }
112 template <typename IfMatchT = Aws::String>
113 void SetIfMatch(IfMatchT&& value) {
114 m_ifMatchHasBeenSet = true;
115 m_ifMatch = std::forward<IfMatchT>(value);
116 }
117 template <typename IfMatchT = Aws::String>
118 HeadObjectRequest& WithIfMatch(IfMatchT&& value) {
119 SetIfMatch(std::forward<IfMatchT>(value));
120 return *this;
121 }
123
125
136 inline const Aws::Utils::DateTime& GetIfModifiedSince() const { return m_ifModifiedSince; }
137 inline bool IfModifiedSinceHasBeenSet() const { return m_ifModifiedSinceHasBeenSet; }
138 template <typename IfModifiedSinceT = Aws::Utils::DateTime>
139 void SetIfModifiedSince(IfModifiedSinceT&& value) {
140 m_ifModifiedSinceHasBeenSet = true;
141 m_ifModifiedSince = std::forward<IfModifiedSinceT>(value);
142 }
143 template <typename IfModifiedSinceT = Aws::Utils::DateTime>
144 HeadObjectRequest& WithIfModifiedSince(IfModifiedSinceT&& value) {
145 SetIfModifiedSince(std::forward<IfModifiedSinceT>(value));
146 return *this;
147 }
149
151
162 inline const Aws::String& GetIfNoneMatch() const { return m_ifNoneMatch; }
163 inline bool IfNoneMatchHasBeenSet() const { return m_ifNoneMatchHasBeenSet; }
164 template <typename IfNoneMatchT = Aws::String>
165 void SetIfNoneMatch(IfNoneMatchT&& value) {
166 m_ifNoneMatchHasBeenSet = true;
167 m_ifNoneMatch = std::forward<IfNoneMatchT>(value);
168 }
169 template <typename IfNoneMatchT = Aws::String>
170 HeadObjectRequest& WithIfNoneMatch(IfNoneMatchT&& value) {
171 SetIfNoneMatch(std::forward<IfNoneMatchT>(value));
172 return *this;
173 }
175
177
188 inline const Aws::Utils::DateTime& GetIfUnmodifiedSince() const { return m_ifUnmodifiedSince; }
189 inline bool IfUnmodifiedSinceHasBeenSet() const { return m_ifUnmodifiedSinceHasBeenSet; }
190 template <typename IfUnmodifiedSinceT = Aws::Utils::DateTime>
191 void SetIfUnmodifiedSince(IfUnmodifiedSinceT&& value) {
192 m_ifUnmodifiedSinceHasBeenSet = true;
193 m_ifUnmodifiedSince = std::forward<IfUnmodifiedSinceT>(value);
194 }
195 template <typename IfUnmodifiedSinceT = Aws::Utils::DateTime>
196 HeadObjectRequest& WithIfUnmodifiedSince(IfUnmodifiedSinceT&& value) {
197 SetIfUnmodifiedSince(std::forward<IfUnmodifiedSinceT>(value));
198 return *this;
199 }
201
203
206 inline const Aws::String& GetKey() const { return m_key; }
207 inline bool KeyHasBeenSet() const { return m_keyHasBeenSet; }
208 template <typename KeyT = Aws::String>
209 void SetKey(KeyT&& value) {
210 m_keyHasBeenSet = true;
211 m_key = std::forward<KeyT>(value);
212 }
213 template <typename KeyT = Aws::String>
214 HeadObjectRequest& WithKey(KeyT&& value) {
215 SetKey(std::forward<KeyT>(value));
216 return *this;
217 }
219
221
227 inline const Aws::String& GetRange() const { return m_range; }
228 inline bool RangeHasBeenSet() const { return m_rangeHasBeenSet; }
229 template <typename RangeT = Aws::String>
230 void SetRange(RangeT&& value) {
231 m_rangeHasBeenSet = true;
232 m_range = std::forward<RangeT>(value);
233 }
234 template <typename RangeT = Aws::String>
235 HeadObjectRequest& WithRange(RangeT&& value) {
236 SetRange(std::forward<RangeT>(value));
237 return *this;
238 }
240
242
245 inline const Aws::String& GetResponseCacheControl() const { return m_responseCacheControl; }
246 inline bool ResponseCacheControlHasBeenSet() const { return m_responseCacheControlHasBeenSet; }
247 template <typename ResponseCacheControlT = Aws::String>
248 void SetResponseCacheControl(ResponseCacheControlT&& value) {
249 m_responseCacheControlHasBeenSet = true;
250 m_responseCacheControl = std::forward<ResponseCacheControlT>(value);
251 }
252 template <typename ResponseCacheControlT = Aws::String>
253 HeadObjectRequest& WithResponseCacheControl(ResponseCacheControlT&& value) {
254 SetResponseCacheControl(std::forward<ResponseCacheControlT>(value));
255 return *this;
256 }
258
260
263 inline const Aws::String& GetResponseContentDisposition() const { return m_responseContentDisposition; }
264 inline bool ResponseContentDispositionHasBeenSet() const { return m_responseContentDispositionHasBeenSet; }
265 template <typename ResponseContentDispositionT = Aws::String>
266 void SetResponseContentDisposition(ResponseContentDispositionT&& value) {
267 m_responseContentDispositionHasBeenSet = true;
268 m_responseContentDisposition = std::forward<ResponseContentDispositionT>(value);
269 }
270 template <typename ResponseContentDispositionT = Aws::String>
271 HeadObjectRequest& WithResponseContentDisposition(ResponseContentDispositionT&& value) {
272 SetResponseContentDisposition(std::forward<ResponseContentDispositionT>(value));
273 return *this;
274 }
276
278
281 inline const Aws::String& GetResponseContentEncoding() const { return m_responseContentEncoding; }
282 inline bool ResponseContentEncodingHasBeenSet() const { return m_responseContentEncodingHasBeenSet; }
283 template <typename ResponseContentEncodingT = Aws::String>
284 void SetResponseContentEncoding(ResponseContentEncodingT&& value) {
285 m_responseContentEncodingHasBeenSet = true;
286 m_responseContentEncoding = std::forward<ResponseContentEncodingT>(value);
287 }
288 template <typename ResponseContentEncodingT = Aws::String>
289 HeadObjectRequest& WithResponseContentEncoding(ResponseContentEncodingT&& value) {
290 SetResponseContentEncoding(std::forward<ResponseContentEncodingT>(value));
291 return *this;
292 }
294
296
299 inline const Aws::String& GetResponseContentLanguage() const { return m_responseContentLanguage; }
300 inline bool ResponseContentLanguageHasBeenSet() const { return m_responseContentLanguageHasBeenSet; }
301 template <typename ResponseContentLanguageT = Aws::String>
302 void SetResponseContentLanguage(ResponseContentLanguageT&& value) {
303 m_responseContentLanguageHasBeenSet = true;
304 m_responseContentLanguage = std::forward<ResponseContentLanguageT>(value);
305 }
306 template <typename ResponseContentLanguageT = Aws::String>
307 HeadObjectRequest& WithResponseContentLanguage(ResponseContentLanguageT&& value) {
308 SetResponseContentLanguage(std::forward<ResponseContentLanguageT>(value));
309 return *this;
310 }
312
314
317 inline const Aws::String& GetResponseContentType() const { return m_responseContentType; }
318 inline bool ResponseContentTypeHasBeenSet() const { return m_responseContentTypeHasBeenSet; }
319 template <typename ResponseContentTypeT = Aws::String>
320 void SetResponseContentType(ResponseContentTypeT&& value) {
321 m_responseContentTypeHasBeenSet = true;
322 m_responseContentType = std::forward<ResponseContentTypeT>(value);
323 }
324 template <typename ResponseContentTypeT = Aws::String>
325 HeadObjectRequest& WithResponseContentType(ResponseContentTypeT&& value) {
326 SetResponseContentType(std::forward<ResponseContentTypeT>(value));
327 return *this;
328 }
330
332
335 inline const Aws::Utils::DateTime& GetResponseExpires() const { return m_responseExpires; }
336 inline bool ResponseExpiresHasBeenSet() const { return m_responseExpiresHasBeenSet; }
337 template <typename ResponseExpiresT = Aws::Utils::DateTime>
338 void SetResponseExpires(ResponseExpiresT&& value) {
339 m_responseExpiresHasBeenSet = true;
340 m_responseExpires = std::forward<ResponseExpiresT>(value);
341 }
342 template <typename ResponseExpiresT = Aws::Utils::DateTime>
343 HeadObjectRequest& WithResponseExpires(ResponseExpiresT&& value) {
344 SetResponseExpires(std::forward<ResponseExpiresT>(value));
345 return *this;
346 }
348
350
355 inline const Aws::String& GetVersionId() const { return m_versionId; }
356 inline bool VersionIdHasBeenSet() const { return m_versionIdHasBeenSet; }
357 template <typename VersionIdT = Aws::String>
358 void SetVersionId(VersionIdT&& value) {
359 m_versionIdHasBeenSet = true;
360 m_versionId = std::forward<VersionIdT>(value);
361 }
362 template <typename VersionIdT = Aws::String>
363 HeadObjectRequest& WithVersionId(VersionIdT&& value) {
364 SetVersionId(std::forward<VersionIdT>(value));
365 return *this;
366 }
368
370
375 inline const Aws::String& GetSSECustomerAlgorithm() const { return m_sSECustomerAlgorithm; }
376 inline bool SSECustomerAlgorithmHasBeenSet() const { return m_sSECustomerAlgorithmHasBeenSet; }
377 template <typename SSECustomerAlgorithmT = Aws::String>
378 void SetSSECustomerAlgorithm(SSECustomerAlgorithmT&& value) {
379 m_sSECustomerAlgorithmHasBeenSet = true;
380 m_sSECustomerAlgorithm = std::forward<SSECustomerAlgorithmT>(value);
381 }
382 template <typename SSECustomerAlgorithmT = Aws::String>
383 HeadObjectRequest& WithSSECustomerAlgorithm(SSECustomerAlgorithmT&& value) {
384 SetSSECustomerAlgorithm(std::forward<SSECustomerAlgorithmT>(value));
385 return *this;
386 }
388
390
398 inline const Aws::String& GetSSECustomerKey() const { return m_sSECustomerKey; }
399 inline bool SSECustomerKeyHasBeenSet() const { return m_sSECustomerKeyHasBeenSet; }
400 template <typename SSECustomerKeyT = Aws::String>
401 void SetSSECustomerKey(SSECustomerKeyT&& value) {
402 m_sSECustomerKeyHasBeenSet = true;
403 m_sSECustomerKey = std::forward<SSECustomerKeyT>(value);
404 }
405 template <typename SSECustomerKeyT = Aws::String>
406 HeadObjectRequest& WithSSECustomerKey(SSECustomerKeyT&& value) {
407 SetSSECustomerKey(std::forward<SSECustomerKeyT>(value));
408 return *this;
409 }
411
413
419 inline const Aws::String& GetSSECustomerKeyMD5() const { return m_sSECustomerKeyMD5; }
420 inline bool SSECustomerKeyMD5HasBeenSet() const { return m_sSECustomerKeyMD5HasBeenSet; }
421 template <typename SSECustomerKeyMD5T = Aws::String>
422 void SetSSECustomerKeyMD5(SSECustomerKeyMD5T&& value) {
423 m_sSECustomerKeyMD5HasBeenSet = true;
424 m_sSECustomerKeyMD5 = std::forward<SSECustomerKeyMD5T>(value);
425 }
426 template <typename SSECustomerKeyMD5T = Aws::String>
427 HeadObjectRequest& WithSSECustomerKeyMD5(SSECustomerKeyMD5T&& value) {
428 SetSSECustomerKeyMD5(std::forward<SSECustomerKeyMD5T>(value));
429 return *this;
430 }
432
434
435 inline RequestPayer GetRequestPayer() const { return m_requestPayer; }
436 inline bool RequestPayerHasBeenSet() const { return m_requestPayerHasBeenSet; }
437 inline void SetRequestPayer(RequestPayer value) {
438 m_requestPayerHasBeenSet = true;
439 m_requestPayer = value;
440 }
442 SetRequestPayer(value);
443 return *this;
444 }
446
448
454 inline int GetPartNumber() const { return m_partNumber; }
455 inline bool PartNumberHasBeenSet() const { return m_partNumberHasBeenSet; }
456 inline void SetPartNumber(int value) {
457 m_partNumberHasBeenSet = true;
458 m_partNumber = value;
459 }
461 SetPartNumber(value);
462 return *this;
463 }
465
467
472 inline const Aws::String& GetExpectedBucketOwner() const { return m_expectedBucketOwner; }
473 inline bool ExpectedBucketOwnerHasBeenSet() const { return m_expectedBucketOwnerHasBeenSet; }
474 template <typename ExpectedBucketOwnerT = Aws::String>
475 void SetExpectedBucketOwner(ExpectedBucketOwnerT&& value) {
476 m_expectedBucketOwnerHasBeenSet = true;
477 m_expectedBucketOwner = std::forward<ExpectedBucketOwnerT>(value);
478 }
479 template <typename ExpectedBucketOwnerT = Aws::String>
480 HeadObjectRequest& WithExpectedBucketOwner(ExpectedBucketOwnerT&& value) {
481 SetExpectedBucketOwner(std::forward<ExpectedBucketOwnerT>(value));
482 return *this;
483 }
485
487
500 inline ChecksumMode GetChecksumMode() const { return m_checksumMode; }
501 inline bool ChecksumModeHasBeenSet() const { return m_checksumModeHasBeenSet; }
502 inline void SetChecksumMode(ChecksumMode value) {
503 m_checksumModeHasBeenSet = true;
504 m_checksumMode = value;
505 }
507 SetChecksumMode(value);
508 return *this;
509 }
511
513
514 inline const Aws::Map<Aws::String, Aws::String>& GetCustomizedAccessLogTag() const { return m_customizedAccessLogTag; }
515 inline bool CustomizedAccessLogTagHasBeenSet() const { return m_customizedAccessLogTagHasBeenSet; }
516 template <typename CustomizedAccessLogTagT = Aws::Map<Aws::String, Aws::String>>
517 void SetCustomizedAccessLogTag(CustomizedAccessLogTagT&& value) {
518 m_customizedAccessLogTagHasBeenSet = true;
519 m_customizedAccessLogTag = std::forward<CustomizedAccessLogTagT>(value);
520 }
521 template <typename CustomizedAccessLogTagT = Aws::Map<Aws::String, Aws::String>>
522 HeadObjectRequest& WithCustomizedAccessLogTag(CustomizedAccessLogTagT&& value) {
523 SetCustomizedAccessLogTag(std::forward<CustomizedAccessLogTagT>(value));
524 return *this;
525 }
526 template <typename CustomizedAccessLogTagKeyT = Aws::String, typename CustomizedAccessLogTagValueT = Aws::String>
527 HeadObjectRequest& AddCustomizedAccessLogTag(CustomizedAccessLogTagKeyT&& key, CustomizedAccessLogTagValueT&& value) {
528 m_customizedAccessLogTagHasBeenSet = true;
529 m_customizedAccessLogTag.emplace(std::forward<CustomizedAccessLogTagKeyT>(key), std::forward<CustomizedAccessLogTagValueT>(value));
530 return *this;
531 }
533 private:
534 Aws::String m_bucket;
535
536 Aws::String m_ifMatch;
537
538 Aws::Utils::DateTime m_ifModifiedSince{};
539
540 Aws::String m_ifNoneMatch;
541
542 Aws::Utils::DateTime m_ifUnmodifiedSince{};
543
544 Aws::String m_key;
545
546 Aws::String m_range;
547
548 Aws::String m_responseCacheControl;
549
550 Aws::String m_responseContentDisposition;
551
552 Aws::String m_responseContentEncoding;
553
554 Aws::String m_responseContentLanguage;
555
556 Aws::String m_responseContentType;
557
558 Aws::Utils::DateTime m_responseExpires{};
559
560 Aws::String m_versionId;
561
562 Aws::String m_sSECustomerAlgorithm;
563
564 Aws::String m_sSECustomerKey;
565
566 Aws::String m_sSECustomerKeyMD5;
567
568 RequestPayer m_requestPayer{RequestPayer::NOT_SET};
569
570 int m_partNumber{0};
571
572 Aws::String m_expectedBucketOwner;
573
574 ChecksumMode m_checksumMode{ChecksumMode::NOT_SET};
575
576 Aws::Map<Aws::String, Aws::String> m_customizedAccessLogTag;
577 bool m_bucketHasBeenSet = false;
578 bool m_ifMatchHasBeenSet = false;
579 bool m_ifModifiedSinceHasBeenSet = false;
580 bool m_ifNoneMatchHasBeenSet = false;
581 bool m_ifUnmodifiedSinceHasBeenSet = false;
582 bool m_keyHasBeenSet = false;
583 bool m_rangeHasBeenSet = false;
584 bool m_responseCacheControlHasBeenSet = false;
585 bool m_responseContentDispositionHasBeenSet = false;
586 bool m_responseContentEncodingHasBeenSet = false;
587 bool m_responseContentLanguageHasBeenSet = false;
588 bool m_responseContentTypeHasBeenSet = false;
589 bool m_responseExpiresHasBeenSet = false;
590 bool m_versionIdHasBeenSet = false;
591 bool m_sSECustomerAlgorithmHasBeenSet = false;
592 bool m_sSECustomerKeyHasBeenSet = false;
593 bool m_sSECustomerKeyMD5HasBeenSet = false;
594 bool m_requestPayerHasBeenSet = false;
595 bool m_partNumberHasBeenSet = false;
596 bool m_expectedBucketOwnerHasBeenSet = false;
597 bool m_checksumModeHasBeenSet = false;
598 bool m_customizedAccessLogTagHasBeenSet = false;
599};
600
601} // namespace Model
602} // namespace S3
603} // namespace Aws
AWS_S3_API Aws::String SerializePayload() const override
AWS_S3_API Aws::Http::HeaderValueCollection GetRequestSpecificHeaders() const override
HeadObjectRequest & WithPartNumber(int value)
const Aws::String & GetResponseCacheControl() const
virtual const char * GetServiceRequestName() const override
const Aws::String & GetIfMatch() const
const Aws::Utils::DateTime & GetResponseExpires() const
HeadObjectRequest & WithChecksumMode(ChecksumMode value)
HeadObjectRequest & WithRange(RangeT &&value)
HeadObjectRequest & WithResponseContentDisposition(ResponseContentDispositionT &&value)
HeadObjectRequest & WithResponseExpires(ResponseExpiresT &&value)
void SetCustomizedAccessLogTag(CustomizedAccessLogTagT &&value)
const Aws::Utils::DateTime & GetIfModifiedSince() const
const Aws::String & GetSSECustomerKey() const
const Aws::String & GetIfNoneMatch() const
const Aws::String & GetVersionId() const
AWS_S3_API HeadObjectRequest()=default
HeadObjectRequest & WithSSECustomerAlgorithm(SSECustomerAlgorithmT &&value)
HeadObjectRequest & WithKey(KeyT &&value)
void SetExpectedBucketOwner(ExpectedBucketOwnerT &&value)
HeadObjectRequest & WithIfNoneMatch(IfNoneMatchT &&value)
void SetSSECustomerKeyMD5(SSECustomerKeyMD5T &&value)
void SetResponseContentType(ResponseContentTypeT &&value)
HeadObjectRequest & WithResponseCacheControl(ResponseCacheControlT &&value)
void SetSSECustomerAlgorithm(SSECustomerAlgorithmT &&value)
const Aws::String & GetSSECustomerKeyMD5() const
const Aws::String & GetResponseContentEncoding() const
HeadObjectRequest & WithSSECustomerKey(SSECustomerKeyT &&value)
void SetChecksumMode(ChecksumMode value)
void SetResponseExpires(ResponseExpiresT &&value)
HeadObjectRequest & WithCustomizedAccessLogTag(CustomizedAccessLogTagT &&value)
const Aws::String & GetBucket() const
AWS_S3_API void AddQueryStringParameters(Aws::Http::URI &uri) const override
const Aws::String & GetResponseContentType() const
HeadObjectRequest & WithIfModifiedSince(IfModifiedSinceT &&value)
HeadObjectRequest & WithResponseContentLanguage(ResponseContentLanguageT &&value)
void SetIfUnmodifiedSince(IfUnmodifiedSinceT &&value)
void SetSSECustomerKey(SSECustomerKeyT &&value)
void SetIfModifiedSince(IfModifiedSinceT &&value)
void SetResponseContentEncoding(ResponseContentEncodingT &&value)
HeadObjectRequest & WithVersionId(VersionIdT &&value)
const Aws::String & GetRange() const
HeadObjectRequest & WithIfMatch(IfMatchT &&value)
const Aws::String & GetExpectedBucketOwner() const
HeadObjectRequest & WithResponseContentType(ResponseContentTypeT &&value)
void SetResponseContentLanguage(ResponseContentLanguageT &&value)
AWS_S3_API EndpointParameters GetEndpointContextParams() const override
AWS_S3_API bool HasEmbeddedError(IOStream &body, const Http::HeaderValueCollection &header) const override
void SetRequestPayer(RequestPayer value)
HeadObjectRequest & AddCustomizedAccessLogTag(CustomizedAccessLogTagKeyT &&key, CustomizedAccessLogTagValueT &&value)
HeadObjectRequest & WithBucket(BucketT &&value)
HeadObjectRequest & WithResponseContentEncoding(ResponseContentEncodingT &&value)
const Aws::Utils::DateTime & GetIfUnmodifiedSince() const
void SetResponseContentDisposition(ResponseContentDispositionT &&value)
const Aws::Map< Aws::String, Aws::String > & GetCustomizedAccessLogTag() const
HeadObjectRequest & WithRequestPayer(RequestPayer value)
const Aws::String & GetResponseContentDisposition() const
const Aws::String & GetKey() const
void SetIfNoneMatch(IfNoneMatchT &&value)
void SetResponseCacheControl(ResponseCacheControlT &&value)
HeadObjectRequest & WithExpectedBucketOwner(ExpectedBucketOwnerT &&value)
HeadObjectRequest & WithIfUnmodifiedSince(IfUnmodifiedSinceT &&value)
void SetVersionId(VersionIdT &&value)
HeadObjectRequest & WithSSECustomerKeyMD5(SSECustomerKeyMD5T &&value)
const Aws::String & GetResponseContentLanguage() const
const Aws::String & GetSSECustomerAlgorithm() const
Aws::Endpoint::EndpointParameters EndpointParameters
Definition S3Request.h:19
Aws::Map< Aws::String, Aws::String > HeaderValueCollection
std::map< K, V, std::less< K >, Aws::Allocator< std::pair< const K, V > > > Map
std::basic_iostream< char, std::char_traits< char > > IOStream
std::basic_string< char, std::char_traits< char >, Aws::Allocator< char > > String