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  }