github.com/chnsz/golangsdk@v0.0.0-20240506093406-85a3fbfa605b/openstack/obs/trait_object.go (about) 1 // Copyright 2019 Huawei Technologies Co.,Ltd. 2 // Licensed under the Apache License, Version 2.0 (the "License"); you may not use 3 // this file except in compliance with the License. You may obtain a copy of the 4 // License at 5 // 6 // http://www.apache.org/licenses/LICENSE-2.0 7 // 8 // Unless required by applicable law or agreed to in writing, software distributed 9 // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 10 // CONDITIONS OF ANY KIND, either express or implied. See the License for the 11 // specific language governing permissions and limitations under the License. 12 13 package obs 14 15 import ( 16 "fmt" 17 "io" 18 "net/url" 19 "strconv" 20 "strings" 21 ) 22 23 func (output *GetObjectOutput) setReadCloser(body io.ReadCloser) { 24 output.Body = body 25 } 26 27 func (input ListObjsInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) { 28 params = make(map[string]string) 29 if input.Prefix != "" { 30 params["prefix"] = input.Prefix 31 } 32 if input.Delimiter != "" { 33 params["delimiter"] = input.Delimiter 34 } 35 if input.MaxKeys > 0 { 36 params["max-keys"] = IntToString(input.MaxKeys) 37 } 38 if input.EncodingType != "" { 39 params["encoding-type"] = input.EncodingType 40 } 41 headers = make(map[string][]string) 42 if origin := strings.TrimSpace(input.Origin); origin != "" { 43 headers[HEADER_ORIGIN_CAMEL] = []string{origin} 44 } 45 if requestHeader := strings.TrimSpace(input.RequestHeader); requestHeader != "" { 46 headers[HEADER_ACCESS_CONTROL_REQUEST_HEADER_CAMEL] = []string{requestHeader} 47 } 48 return 49 } 50 51 func (input ListObjectsInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) { 52 params, headers, data, err = input.ListObjsInput.trans(isObs) 53 if err != nil { 54 return 55 } 56 if input.Marker != "" { 57 params["marker"] = input.Marker 58 } 59 return 60 } 61 62 func (input ListVersionsInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) { 63 params, headers, data, err = input.ListObjsInput.trans(isObs) 64 if err != nil { 65 return 66 } 67 params[string(SubResourceVersions)] = "" 68 if input.KeyMarker != "" { 69 params["key-marker"] = input.KeyMarker 70 } 71 if input.VersionIdMarker != "" { 72 params["version-id-marker"] = input.VersionIdMarker 73 } 74 return 75 } 76 77 func (input DeleteObjectInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) { 78 params = make(map[string]string) 79 if input.VersionId != "" { 80 params[PARAM_VERSION_ID] = input.VersionId 81 } 82 return 83 } 84 85 func (input DeleteObjectsInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) { 86 params = map[string]string{string(SubResourceDelete): ""} 87 if strings.ToLower(input.EncodingType) == "url" { 88 for index, object := range input.Objects { 89 input.Objects[index].Key = url.QueryEscape(object.Key) 90 } 91 } 92 data, md5 := convertDeleteObjectsToXML(input) 93 headers = map[string][]string{HEADER_MD5_CAMEL: {md5}} 94 return 95 } 96 97 func (input SetObjectAclInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) { 98 params = map[string]string{string(SubResourceAcl): ""} 99 if input.VersionId != "" { 100 params[PARAM_VERSION_ID] = input.VersionId 101 } 102 headers = make(map[string][]string) 103 if acl := string(input.ACL); acl != "" { 104 setHeaders(headers, HEADER_ACL, []string{acl}, isObs) 105 } else { 106 data, _ = ConvertAclToXml(input.AccessControlPolicy, false, isObs) 107 } 108 return 109 } 110 111 func (input GetObjectAclInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) { 112 params = map[string]string{string(SubResourceAcl): ""} 113 if input.VersionId != "" { 114 params[PARAM_VERSION_ID] = input.VersionId 115 } 116 return 117 } 118 119 func (input RestoreObjectInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) { 120 params = map[string]string{string(SubResourceRestore): ""} 121 if input.VersionId != "" { 122 params[PARAM_VERSION_ID] = input.VersionId 123 } 124 if !isObs { 125 data, err = ConvertRequestToIoReader(input) 126 } else { 127 data = ConverntObsRestoreToXml(input) 128 } 129 return 130 } 131 132 func (input GetObjectMetadataInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) { 133 params = make(map[string]string) 134 if input.VersionId != "" { 135 params[PARAM_VERSION_ID] = input.VersionId 136 } 137 headers = make(map[string][]string) 138 139 if input.Origin != "" { 140 headers[HEADER_ORIGIN_CAMEL] = []string{input.Origin} 141 } 142 143 if input.RequestHeader != "" { 144 headers[HEADER_ACCESS_CONTROL_REQUEST_HEADER_CAMEL] = []string{input.RequestHeader} 145 } 146 setSseHeader(headers, input.SseHeader, true, isObs) 147 return 148 } 149 150 func (input SetObjectMetadataInput) prepareContentHeaders(headers map[string][]string) { 151 if input.CacheControl != "" { 152 headers[HEADER_CACHE_CONTROL_CAMEL] = []string{input.CacheControl} 153 } 154 if input.ContentDisposition != "" { 155 headers[HEADER_CONTENT_DISPOSITION_CAMEL] = []string{input.ContentDisposition} 156 } 157 if input.ContentEncoding != "" { 158 headers[HEADER_CONTENT_ENCODING_CAMEL] = []string{input.ContentEncoding} 159 } 160 if input.ContentLanguage != "" { 161 headers[HEADER_CONTENT_LANGUAGE_CAMEL] = []string{input.ContentLanguage} 162 } 163 if input.ContentType != "" { 164 headers[HEADER_CONTENT_TYPE_CAML] = []string{input.ContentType} 165 } 166 // 这里为了兼容老版本,默认以Expire值为准,但如果Expires没有,则以HttpExpires为准。 167 if input.Expires != "" { 168 headers[HEADER_EXPIRES_CAMEL] = []string{input.Expires} 169 } else if input.HttpExpires != "" { 170 headers[HEADER_EXPIRES_CAMEL] = []string{input.HttpExpires} 171 } 172 } 173 174 func (input SetObjectMetadataInput) prepareStorageClass(headers map[string][]string, isObs bool) { 175 if storageClass := string(input.StorageClass); storageClass != "" { 176 if !isObs { 177 if storageClass == string(StorageClassWarm) { 178 storageClass = string(storageClassStandardIA) 179 } else if storageClass == string(StorageClassCold) { 180 storageClass = string(storageClassGlacier) 181 } 182 } 183 setHeaders(headers, HEADER_STORAGE_CLASS2, []string{storageClass}, isObs) 184 } 185 } 186 187 func (input SetObjectMetadataInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) { 188 params = make(map[string]string) 189 params = map[string]string{string(SubResourceMetadata): ""} 190 if input.VersionId != "" { 191 params[PARAM_VERSION_ID] = input.VersionId 192 } 193 headers = make(map[string][]string) 194 195 if directive := string(input.MetadataDirective); directive != "" { 196 setHeaders(headers, HEADER_METADATA_DIRECTIVE, []string{string(input.MetadataDirective)}, isObs) 197 } else { 198 setHeaders(headers, HEADER_METADATA_DIRECTIVE, []string{string(ReplaceNew)}, isObs) 199 } 200 201 input.prepareContentHeaders(headers) 202 if input.WebsiteRedirectLocation != "" { 203 setHeaders(headers, HEADER_WEBSITE_REDIRECT_LOCATION, []string{input.WebsiteRedirectLocation}, isObs) 204 } 205 input.prepareStorageClass(headers, isObs) 206 if input.Metadata != nil { 207 for key, value := range input.Metadata { 208 key = strings.TrimSpace(key) 209 setHeadersNext(headers, HEADER_PREFIX_META_OBS+key, HEADER_PREFIX_META+key, []string{value}, isObs) 210 } 211 } 212 return 213 } 214 215 func (input GetObjectInput) prepareResponseParams(params map[string]string) { 216 if input.ResponseCacheControl != "" { 217 params[PARAM_RESPONSE_CACHE_CONTROL] = input.ResponseCacheControl 218 } 219 if input.ResponseContentDisposition != "" { 220 params[PARAM_RESPONSE_CONTENT_DISPOSITION] = input.ResponseContentDisposition 221 } 222 if input.ResponseContentEncoding != "" { 223 params[PARAM_RESPONSE_CONTENT_ENCODING] = input.ResponseContentEncoding 224 } 225 if input.ResponseContentLanguage != "" { 226 params[PARAM_RESPONSE_CONTENT_LANGUAGE] = input.ResponseContentLanguage 227 } 228 if input.ResponseContentType != "" { 229 params[PARAM_RESPONSE_CONTENT_TYPE] = input.ResponseContentType 230 } 231 if input.ResponseExpires != "" { 232 params[PARAM_RESPONSE_EXPIRES] = input.ResponseExpires 233 } 234 } 235 236 func (input GetObjectInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) { 237 params, headers, data, err = input.GetObjectMetadataInput.trans(isObs) 238 if err != nil { 239 return 240 } 241 input.prepareResponseParams(params) 242 if input.ImageProcess != "" { 243 params[PARAM_IMAGE_PROCESS] = input.ImageProcess 244 } 245 if input.RangeStart >= 0 && input.RangeEnd > input.RangeStart { 246 headers[HEADER_RANGE] = []string{fmt.Sprintf("bytes=%d-%d", input.RangeStart, input.RangeEnd)} 247 } 248 if input.AcceptEncoding != "" { 249 headers[HEADER_ACCEPT_ENCODING] = []string{input.AcceptEncoding} 250 } 251 if input.IfMatch != "" { 252 headers[HEADER_IF_MATCH] = []string{input.IfMatch} 253 } 254 if input.IfNoneMatch != "" { 255 headers[HEADER_IF_NONE_MATCH] = []string{input.IfNoneMatch} 256 } 257 if !input.IfModifiedSince.IsZero() { 258 headers[HEADER_IF_MODIFIED_SINCE] = []string{FormatUtcToRfc1123(input.IfModifiedSince)} 259 } 260 if !input.IfUnmodifiedSince.IsZero() { 261 headers[HEADER_IF_UNMODIFIED_SINCE] = []string{FormatUtcToRfc1123(input.IfUnmodifiedSince)} 262 } 263 return 264 } 265 266 func (input ObjectOperationInput) prepareGrantHeaders(headers map[string][]string, isObs bool) { 267 if GrantReadID := input.GrantReadId; GrantReadID != "" { 268 setHeaders(headers, HEADER_GRANT_READ_OBS, []string{GrantReadID}, isObs) 269 } 270 if GrantReadAcpID := input.GrantReadAcpId; GrantReadAcpID != "" { 271 setHeaders(headers, HEADER_GRANT_READ_ACP_OBS, []string{GrantReadAcpID}, isObs) 272 } 273 if GrantWriteAcpID := input.GrantWriteAcpId; GrantWriteAcpID != "" { 274 setHeaders(headers, HEADER_GRANT_WRITE_ACP_OBS, []string{GrantWriteAcpID}, isObs) 275 } 276 if GrantFullControlID := input.GrantFullControlId; GrantFullControlID != "" { 277 setHeaders(headers, HEADER_GRANT_FULL_CONTROL_OBS, []string{GrantFullControlID}, isObs) 278 } 279 } 280 281 func (input ObjectOperationInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) { 282 headers = make(map[string][]string) 283 params = make(map[string]string) 284 if acl := string(input.ACL); acl != "" { 285 setHeaders(headers, HEADER_ACL, []string{acl}, isObs) 286 } 287 input.prepareGrantHeaders(headers, isObs) 288 if storageClass := string(input.StorageClass); storageClass != "" { 289 if !isObs { 290 if storageClass == string(StorageClassWarm) { 291 storageClass = string(storageClassStandardIA) 292 } else if storageClass == string(StorageClassCold) { 293 storageClass = string(storageClassGlacier) 294 } 295 } 296 setHeaders(headers, HEADER_STORAGE_CLASS2, []string{storageClass}, isObs) 297 } 298 if input.WebsiteRedirectLocation != "" { 299 setHeaders(headers, HEADER_WEBSITE_REDIRECT_LOCATION, []string{input.WebsiteRedirectLocation}, isObs) 300 301 } 302 setSseHeader(headers, input.SseHeader, false, isObs) 303 if input.Expires != 0 { 304 setHeaders(headers, HEADER_EXPIRES, []string{Int64ToString(input.Expires)}, true) 305 } 306 if input.Metadata != nil { 307 for key, value := range input.Metadata { 308 key = strings.TrimSpace(key) 309 setHeadersNext(headers, HEADER_PREFIX_META_OBS+key, HEADER_PREFIX_META+key, []string{value}, isObs) 310 } 311 } 312 return 313 } 314 315 func (input PutObjectBasicInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) { 316 params, headers, data, err = input.ObjectOperationInput.trans(isObs) 317 if err != nil { 318 return 319 } 320 321 if input.ContentMD5 != "" { 322 headers[HEADER_MD5_CAMEL] = []string{input.ContentMD5} 323 } 324 325 if input.ContentLength > 0 { 326 headers[HEADER_CONTENT_LENGTH_CAMEL] = []string{Int64ToString(input.ContentLength)} 327 } 328 if input.ContentType != "" { 329 headers[HEADER_CONTENT_TYPE_CAML] = []string{input.ContentType} 330 } 331 if input.ContentEncoding != "" { 332 headers[HEADER_CONTENT_ENCODING_CAMEL] = []string{input.ContentEncoding} 333 } 334 if input.CacheControl != "" { 335 headers[HEADER_CACHE_CONTROL_CAMEL] = []string{input.CacheControl} 336 } 337 if input.ContentDisposition != "" { 338 headers[HEADER_CONTENT_DISPOSITION_CAMEL] = []string{input.ContentDisposition} 339 } 340 if input.ContentLanguage != "" { 341 headers[HEADER_CONTENT_LANGUAGE_CAMEL] = []string{input.ContentLanguage} 342 } 343 if input.HttpExpires != "" { 344 headers[HEADER_EXPIRES_CAMEL] = []string{input.HttpExpires} 345 } 346 return 347 } 348 349 func (input PutObjectInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) { 350 params, headers, data, err = input.PutObjectBasicInput.trans(isObs) 351 if err != nil { 352 return 353 } 354 if input.Body != nil { 355 data = input.Body 356 } 357 return 358 } 359 360 func (input AppendObjectInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) { 361 params, headers, data, err = input.PutObjectBasicInput.trans(isObs) 362 if err != nil { 363 return 364 } 365 params[string(SubResourceAppend)] = "" 366 params["position"] = strconv.FormatInt(input.Position, 10) 367 if input.Body != nil { 368 data = input.Body 369 } 370 return 371 } 372 373 func (input ModifyObjectInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) { 374 headers = make(map[string][]string) 375 params = make(map[string]string) 376 params[string(SubResourceModify)] = "" 377 params["position"] = strconv.FormatInt(input.Position, 10) 378 if input.ContentLength > 0 { 379 headers[HEADER_CONTENT_LENGTH_CAMEL] = []string{Int64ToString(input.ContentLength)} 380 } 381 382 if input.Body != nil { 383 data = input.Body 384 } 385 return 386 } 387 388 func (input CopyObjectInput) prepareReplaceHeaders(headers map[string][]string) { 389 if input.CacheControl != "" { 390 headers[HEADER_CACHE_CONTROL] = []string{input.CacheControl} 391 } 392 if input.ContentDisposition != "" { 393 headers[HEADER_CONTENT_DISPOSITION] = []string{input.ContentDisposition} 394 } 395 if input.ContentEncoding != "" { 396 headers[HEADER_CONTENT_ENCODING] = []string{input.ContentEncoding} 397 } 398 if input.ContentLanguage != "" { 399 headers[HEADER_CONTENT_LANGUAGE] = []string{input.ContentLanguage} 400 } 401 if input.ContentType != "" { 402 headers[HEADER_CONTENT_TYPE] = []string{input.ContentType} 403 } 404 if input.Expires != "" { 405 headers[HEADER_EXPIRES] = []string{input.Expires} 406 } 407 } 408 409 func (input CopyObjectInput) prepareCopySourceHeaders(headers map[string][]string, isObs bool) { 410 if input.CopySourceIfMatch != "" { 411 setHeaders(headers, HEADER_COPY_SOURCE_IF_MATCH, []string{input.CopySourceIfMatch}, isObs) 412 } 413 if input.CopySourceIfNoneMatch != "" { 414 setHeaders(headers, HEADER_COPY_SOURCE_IF_NONE_MATCH, []string{input.CopySourceIfNoneMatch}, isObs) 415 } 416 if !input.CopySourceIfModifiedSince.IsZero() { 417 setHeaders(headers, HEADER_COPY_SOURCE_IF_MODIFIED_SINCE, []string{FormatUtcToRfc1123(input.CopySourceIfModifiedSince)}, isObs) 418 } 419 if !input.CopySourceIfUnmodifiedSince.IsZero() { 420 setHeaders(headers, HEADER_COPY_SOURCE_IF_UNMODIFIED_SINCE, []string{FormatUtcToRfc1123(input.CopySourceIfUnmodifiedSince)}, isObs) 421 } 422 } 423 424 func (input CopyObjectInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) { 425 params, headers, data, err = input.ObjectOperationInput.trans(isObs) 426 if err != nil { 427 return 428 } 429 430 var copySource string 431 if input.CopySourceVersionId != "" { 432 copySource = fmt.Sprintf("%s/%s?versionId=%s", input.CopySourceBucket, UrlEncode(input.CopySourceKey, false), input.CopySourceVersionId) 433 } else { 434 copySource = fmt.Sprintf("%s/%s", input.CopySourceBucket, UrlEncode(input.CopySourceKey, false)) 435 } 436 setHeaders(headers, HEADER_COPY_SOURCE, []string{copySource}, isObs) 437 438 if directive := string(input.MetadataDirective); directive != "" { 439 setHeaders(headers, HEADER_METADATA_DIRECTIVE, []string{directive}, isObs) 440 } 441 442 if input.MetadataDirective == ReplaceMetadata { 443 input.prepareReplaceHeaders(headers) 444 } 445 446 input.prepareCopySourceHeaders(headers, isObs) 447 if input.SourceSseHeader != nil { 448 if sseCHeader, ok := input.SourceSseHeader.(SseCHeader); ok { 449 setHeaders(headers, HEADER_SSEC_COPY_SOURCE_ENCRYPTION, []string{sseCHeader.GetEncryption()}, isObs) 450 setHeaders(headers, HEADER_SSEC_COPY_SOURCE_KEY, []string{sseCHeader.GetKey()}, isObs) 451 setHeaders(headers, HEADER_SSEC_COPY_SOURCE_KEY_MD5, []string{sseCHeader.GetKeyMD5()}, isObs) 452 } 453 } 454 if input.SuccessActionRedirect != "" { 455 headers[HEADER_SUCCESS_ACTION_REDIRECT] = []string{input.SuccessActionRedirect} 456 } 457 return 458 } 459 460 func (input HeadObjectInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) { 461 params = make(map[string]string) 462 if input.VersionId != "" { 463 params[PARAM_VERSION_ID] = input.VersionId 464 } 465 return 466 } 467 468 func (input RenameFileInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) { 469 params = map[string]string{string(SubResourceRename): ""} 470 params["name"] = input.NewObjectKey 471 headers = make(map[string][]string) 472 if requestPayer := string(input.RequestPayer); requestPayer != "" { 473 headers[HEADER_REQUEST_PAYER] = []string{requestPayer} 474 } 475 return 476 } 477 478 func (input RenameFolderInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) { 479 params = map[string]string{string(SubResourceRename): ""} 480 params["name"] = input.NewObjectKey 481 headers = make(map[string][]string) 482 if requestPayer := string(input.RequestPayer); requestPayer != "" { 483 headers[HEADER_REQUEST_PAYER] = []string{requestPayer} 484 } 485 return 486 }