github.com/chnsz/golangsdk@v0.0.0-20240506093406-85a3fbfa605b/openstack/obs/trait_base.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  	"io"
    17  )
    18  
    19  type IRepeatable interface {
    20  	Reset() error
    21  }
    22  
    23  // IReadCloser defines interface with function: setReadCloser
    24  type IReadCloser interface {
    25  	setReadCloser(body io.ReadCloser)
    26  }
    27  
    28  func setHeaders(headers map[string][]string, header string, headerValue []string, isObs bool) {
    29  	if isObs {
    30  		header = HEADER_PREFIX_OBS + header
    31  		headers[header] = headerValue
    32  	} else {
    33  		header = HEADER_PREFIX + header
    34  		headers[header] = headerValue
    35  	}
    36  }
    37  
    38  func setHeadersNext(headers map[string][]string, header string, headerNext string, headerValue []string, isObs bool) {
    39  	if isObs {
    40  		headers[header] = headerValue
    41  	} else {
    42  		headers[headerNext] = headerValue
    43  	}
    44  }
    45  
    46  // IBaseModel defines interface for base response model
    47  type IBaseModel interface {
    48  	setStatusCode(statusCode int)
    49  
    50  	setRequestID(requestID string)
    51  
    52  	setResponseHeaders(responseHeaders map[string][]string)
    53  }
    54  
    55  // ISerializable defines interface with function: trans
    56  type ISerializable interface {
    57  	trans(isObs bool) (map[string]string, map[string][]string, interface{}, error)
    58  }
    59  
    60  // DefaultSerializable defines default serializable struct
    61  type DefaultSerializable struct {
    62  	params  map[string]string
    63  	headers map[string][]string
    64  	data    interface{}
    65  }
    66  
    67  func (input DefaultSerializable) trans(isObs bool) (map[string]string, map[string][]string, interface{}, error) {
    68  	return input.params, input.headers, input.data, nil
    69  }
    70  
    71  var defaultSerializable = &DefaultSerializable{}
    72  
    73  func newSubResourceSerialV2(subResource SubResourceType, value string) *DefaultSerializable {
    74  	return &DefaultSerializable{map[string]string{string(subResource): value}, nil, nil}
    75  }
    76  
    77  func newSubResourceSerial(subResource SubResourceType) *DefaultSerializable {
    78  	return &DefaultSerializable{map[string]string{string(subResource): ""}, nil, nil}
    79  }
    80  
    81  func trans(subResource SubResourceType, input interface{}) (params map[string]string, headers map[string][]string, data interface{}, err error) {
    82  	params = map[string]string{string(subResource): ""}
    83  	data, err = ConvertRequestToIoReader(input)
    84  	return
    85  }
    86  
    87  func (baseModel *BaseModel) setStatusCode(statusCode int) {
    88  	baseModel.StatusCode = statusCode
    89  }
    90  
    91  func (baseModel *BaseModel) setRequestID(requestID string) {
    92  	baseModel.RequestId = requestID
    93  }
    94  
    95  func (baseModel *BaseModel) setResponseHeaders(responseHeaders map[string][]string) {
    96  	baseModel.ResponseHeaders = responseHeaders
    97  }
    98  
    99  // GetEncryption gets the Encryption field value from SseKmsHeader
   100  func (header SseKmsHeader) GetEncryption() string {
   101  	if header.Encryption != "" {
   102  		return header.Encryption
   103  	}
   104  	if !header.isObs {
   105  		return DEFAULT_SSE_KMS_ENCRYPTION
   106  	}
   107  	return DEFAULT_SSE_KMS_ENCRYPTION_OBS
   108  }
   109  
   110  // GetKey gets the Key field value from SseKmsHeader
   111  func (header SseKmsHeader) GetKey() string {
   112  	return header.Key
   113  }
   114  
   115  // GetEncryption gets the Encryption field value from SseCHeader
   116  func (header SseCHeader) GetEncryption() string {
   117  	if header.Encryption != "" {
   118  		return header.Encryption
   119  	}
   120  	return DEFAULT_SSE_C_ENCRYPTION
   121  }
   122  
   123  // GetKey gets the Key field value from SseCHeader
   124  func (header SseCHeader) GetKey() string {
   125  	return header.Key
   126  }
   127  
   128  // GetKeyMD5 gets the KeyMD5 field value from SseCHeader
   129  func (header SseCHeader) GetKeyMD5() string {
   130  	if header.KeyMD5 != "" {
   131  		return header.KeyMD5
   132  	}
   133  
   134  	if ret, err := Base64Decode(header.GetKey()); err == nil {
   135  		return Base64Md5(ret)
   136  	}
   137  	return ""
   138  }
   139  
   140  func setSseHeader(headers map[string][]string, sseHeader ISseHeader, sseCOnly bool, isObs bool) {
   141  	if sseHeader != nil {
   142  		if sseCHeader, ok := sseHeader.(SseCHeader); ok {
   143  			setHeaders(headers, HEADER_SSEC_ENCRYPTION, []string{sseCHeader.GetEncryption()}, isObs)
   144  			setHeaders(headers, HEADER_SSEC_KEY, []string{sseCHeader.GetKey()}, isObs)
   145  			setHeaders(headers, HEADER_SSEC_KEY_MD5, []string{sseCHeader.GetKeyMD5()}, isObs)
   146  		} else if sseKmsHeader, ok := sseHeader.(SseKmsHeader); !sseCOnly && ok {
   147  			sseKmsHeader.isObs = isObs
   148  			setHeaders(headers, HEADER_SSEKMS_ENCRYPTION, []string{sseKmsHeader.GetEncryption()}, isObs)
   149  			if sseKmsHeader.GetKey() != "" {
   150  				setHeadersNext(headers, HEADER_SSEKMS_KEY_OBS, HEADER_SSEKMS_KEY_AMZ, []string{sseKmsHeader.GetKey()}, isObs)
   151  			}
   152  		}
   153  	}
   154  }