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 }