1 /*
2  * Copyright 2009-2017 Alibaba Cloud 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  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <alibabacloud/oss/model/ObjectMetaData.h>
18 #include <alibabacloud/oss/http/HttpType.h>
19 #include "utils/Utils.h"
20 
21 using namespace AlibabaCloud::OSS;
22 
23 static const std::string gEmpty = "";
24 
ObjectMetaData(const HeaderCollection & data)25 ObjectMetaData::ObjectMetaData(const HeaderCollection& data)
26 {
27     *this = data;
28 }
29 
operator =(const HeaderCollection & data)30 ObjectMetaData& ObjectMetaData::operator=(const HeaderCollection& data)
31 {
32     for (auto const &header : data) {
33         if (!header.first.compare(0, 11, "x-oss-meta-", 11))
34             userMetaData_[header.first.substr(11)] = header.second;
35         else
36             metaData_[header.first] = header.second;
37     }
38 
39     if (metaData_.find(Http::ETAG) != metaData_.end()) {
40         metaData_[Http::ETAG] = TrimQuotes(metaData_.at(Http::ETAG).c_str());
41     }
42 
43     return *this;
44 }
45 
LastModified() const46 const std::string &ObjectMetaData::LastModified() const
47 {
48     if (metaData_.find(Http::LAST_MODIFIED) != metaData_.end()) {
49         return metaData_.at(Http::LAST_MODIFIED);
50     }
51     return gEmpty;
52 }
53 
ExpirationTime() const54 const std::string &ObjectMetaData::ExpirationTime() const
55 {
56     if (metaData_.find(Http::EXPIRES) != metaData_.end()) {
57         return metaData_.at(Http::EXPIRES);
58     }
59     return gEmpty;
60 }
61 
ContentLength() const62 int64_t ObjectMetaData::ContentLength() const
63 {
64     if (metaData_.find(Http::CONTENT_LENGTH) != metaData_.end()) {
65         return atoll(metaData_.at(Http::CONTENT_LENGTH).c_str());
66     }
67     return -1;
68 }
69 
ContentType() const70 const std::string &ObjectMetaData::ContentType() const
71 {
72     if (metaData_.find(Http::CONTENT_TYPE) != metaData_.end()) {
73         return metaData_.at(Http::CONTENT_TYPE);
74     }
75     return gEmpty;
76 }
77 
ContentEncoding() const78 const std::string &ObjectMetaData::ContentEncoding() const
79 {
80     if (metaData_.find(Http::CONTENT_ENCODING) != metaData_.end()) {
81         return metaData_.at(Http::CONTENT_ENCODING);
82     }
83     return gEmpty;
84 }
85 
CacheControl() const86 const std::string &ObjectMetaData::CacheControl() const
87 {
88     if (metaData_.find(Http::CACHE_CONTROL) != metaData_.end()) {
89         return metaData_.at(Http::CACHE_CONTROL);
90     }
91     return gEmpty;
92 }
93 
ContentDisposition() const94 const std::string &ObjectMetaData::ContentDisposition() const
95 {
96     if (metaData_.find(Http::CONTENT_DISPOSITION) != metaData_.end()) {
97         return metaData_.at(Http::CONTENT_DISPOSITION);
98     }
99     return gEmpty;
100 }
101 
ETag() const102 const std::string &ObjectMetaData::ETag() const
103 {
104     if (metaData_.find(Http::ETAG) != metaData_.end()) {
105         return metaData_.at(Http::ETAG);
106     }
107     return gEmpty;
108 }
109 
ContentMd5() const110 const std::string &ObjectMetaData::ContentMd5() const
111 {
112     if (metaData_.find(Http::CONTENT_MD5) != metaData_.end()) {
113         return metaData_.at(Http::CONTENT_MD5);
114     }
115     return gEmpty;
116 }
117 
CRC64() const118 uint64_t ObjectMetaData::CRC64() const
119 {
120     if (metaData_.find("x-oss-hash-crc64ecma") != metaData_.end()) {
121         return std::strtoull(metaData_.at("x-oss-hash-crc64ecma").c_str(), nullptr, 10);
122     }
123     return 0ULL;
124 }
125 
ObjectType() const126 const std::string &ObjectMetaData::ObjectType() const
127 {
128     if (metaData_.find("x-oss-object-type") != metaData_.end()) {
129         return metaData_.at("x-oss-object-type");
130     }
131     return gEmpty;
132 }
133 
VersionId() const134 const std::string& ObjectMetaData::VersionId() const
135 {
136     if (metaData_.find("x-oss-version-id") != metaData_.end()) {
137         return metaData_.at("x-oss-version-id");
138     }
139     return gEmpty;
140 }
141 
setExpirationTime(const std::string & value)142 void ObjectMetaData::setExpirationTime(const std::string &value)
143 {
144     metaData_[Http::EXPIRES] = value;
145 }
146 
setContentLength(int64_t value)147 void ObjectMetaData::setContentLength(int64_t value)
148 {
149     metaData_[Http::CONTENT_LENGTH] = std::to_string(value);
150 }
151 
setContentType(const std::string & value)152 void ObjectMetaData::setContentType(const std::string &value)
153 {
154     metaData_[Http::CONTENT_TYPE] = value;
155 }
156 
setContentEncoding(const std::string & value)157 void ObjectMetaData::setContentEncoding(const std::string &value)
158 {
159     metaData_[Http::CONTENT_ENCODING] = value;
160 }
161 
setCacheControl(const std::string & value)162 void ObjectMetaData::setCacheControl(const std::string &value)
163 {
164     metaData_[Http::CACHE_CONTROL] = value;
165 }
166 
setContentDisposition(const std::string & value)167 void ObjectMetaData::setContentDisposition(const std::string &value)
168 {
169     metaData_[Http::CONTENT_DISPOSITION] = value;
170 }
171 
setETag(const std::string & value)172 void ObjectMetaData::setETag(const std::string &value)
173 {
174     metaData_[Http::ETAG] = value;
175 }
176 
setContentMd5(const std::string & value)177 void ObjectMetaData::setContentMd5(const std::string &value)
178 {
179     metaData_[Http::CONTENT_MD5] = value;
180 }
181 
setCrc64(uint64_t value)182 void ObjectMetaData::setCrc64(uint64_t value)
183 {
184     metaData_["x-oss-hash-crc64ecma"] = std::to_string(value);
185 }
186 
addHeader(const std::string & key,const std::string & value)187 void ObjectMetaData::addHeader(const std::string &key, const std::string &value)
188 {
189     metaData_[key] = value;
190 }
191 
hasHeader(const std::string & key) const192 bool ObjectMetaData::hasHeader(const std::string& key) const
193 {
194     return (metaData_.find(key) != metaData_.end());
195 }
196 
removeHeader(const std::string & key)197 void ObjectMetaData::removeHeader(const std::string& key)
198 {
199     if (metaData_.find(key) != metaData_.end()) {
200         metaData_.erase(key);
201     }
202 }
203 
HttpMetaData()204 MetaData &ObjectMetaData::HttpMetaData()
205 {
206     return metaData_;
207 }
208 
HttpMetaData() const209 const MetaData &ObjectMetaData::HttpMetaData() const
210 {
211     return metaData_;
212 }
213 
addUserHeader(const std::string & key,const std::string & value)214 void ObjectMetaData::addUserHeader(const std::string &key, const std::string &value)
215 {
216     userMetaData_[key] = value;
217 }
218 
hasUserHeader(const std::string & key) const219 bool ObjectMetaData::hasUserHeader(const std::string& key) const
220 {
221     return (userMetaData_.find(key) != userMetaData_.end());
222 }
223 
removeUserHeader(const std::string & key)224 void ObjectMetaData::removeUserHeader(const std::string& key)
225 {
226     if (userMetaData_.find(key) != userMetaData_.end()) {
227         userMetaData_.erase(key);
228     }
229 }
230 
UserMetaData()231 MetaData &ObjectMetaData::UserMetaData()
232 {
233     return userMetaData_;
234 }
235 
UserMetaData() const236 const MetaData &ObjectMetaData::UserMetaData() const
237 {
238     return userMetaData_;
239 }
240 
toHeaderCollection() const241 HeaderCollection ObjectMetaData::toHeaderCollection() const
242 {
243     HeaderCollection headers;
244     for (auto const&header : metaData_) {
245         headers[header.first] = header.second;
246     }
247 
248     for (auto const&header : userMetaData_) {
249         std::string key("x-oss-meta-");
250         key.append(header.first);
251         headers[key] = header.second;
252     }
253     return headers;
254 }
255