You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

trait.go 32 kB

4 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909
  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. //nolint:structcheck, unused
  13. //nolint:golint, unused
  14. package obs
  15. import (
  16. "bytes"
  17. "fmt"
  18. "io"
  19. "os"
  20. "strings"
  21. )
  22. // IReadCloser defines interface with function: setReadCloser
  23. type IReadCloser interface {
  24. setReadCloser(body io.ReadCloser)
  25. }
  26. func (output *GetObjectOutput) setReadCloser(body io.ReadCloser) {
  27. output.Body = body
  28. }
  29. func setHeaders(headers map[string][]string, header string, headerValue []string, isObs bool) {
  30. if isObs {
  31. header = HEADER_PREFIX_OBS + header
  32. headers[header] = headerValue
  33. } else {
  34. header = HEADER_PREFIX + header
  35. headers[header] = headerValue
  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. // IBaseModel defines interface for base response model
  46. type IBaseModel interface {
  47. setStatusCode(statusCode int)
  48. setRequestID(requestID string)
  49. setResponseHeaders(responseHeaders map[string][]string)
  50. }
  51. // ISerializable defines interface with function: trans
  52. type ISerializable interface {
  53. trans(isObs bool) (map[string]string, map[string][]string, interface{}, error)
  54. }
  55. // DefaultSerializable defines default serializable struct
  56. type DefaultSerializable struct {
  57. params map[string]string
  58. headers map[string][]string
  59. data interface{}
  60. }
  61. func (input DefaultSerializable) trans(isObs bool) (map[string]string, map[string][]string, interface{}, error) {
  62. return input.params, input.headers, input.data, nil
  63. }
  64. var defaultSerializable = &DefaultSerializable{}
  65. func newSubResourceSerial(subResource SubResourceType) *DefaultSerializable {
  66. return &DefaultSerializable{map[string]string{string(subResource): ""}, nil, nil}
  67. }
  68. func trans(subResource SubResourceType, input interface{}) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  69. params = map[string]string{string(subResource): ""}
  70. data, err = ConvertRequestToIoReader(input)
  71. return
  72. }
  73. func (baseModel *BaseModel) setStatusCode(statusCode int) {
  74. baseModel.StatusCode = statusCode
  75. }
  76. func (baseModel *BaseModel) setRequestID(requestID string) {
  77. baseModel.RequestId = requestID
  78. }
  79. func (baseModel *BaseModel) setResponseHeaders(responseHeaders map[string][]string) {
  80. baseModel.ResponseHeaders = responseHeaders
  81. }
  82. func (input ListBucketsInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  83. headers = make(map[string][]string)
  84. if input.QueryLocation && !isObs {
  85. setHeaders(headers, HEADER_LOCATION_AMZ, []string{"true"}, isObs)
  86. }
  87. return
  88. }
  89. func (input CreateBucketInput) prepareGrantHeaders(headers map[string][]string, isObs bool) {
  90. if grantReadID := input.GrantReadId; grantReadID != "" {
  91. setHeaders(headers, HEADER_GRANT_READ_OBS, []string{grantReadID}, isObs)
  92. }
  93. if grantWriteID := input.GrantWriteId; grantWriteID != "" {
  94. setHeaders(headers, HEADER_GRANT_WRITE_OBS, []string{grantWriteID}, isObs)
  95. }
  96. if grantReadAcpID := input.GrantReadAcpId; grantReadAcpID != "" {
  97. setHeaders(headers, HEADER_GRANT_READ_ACP_OBS, []string{grantReadAcpID}, isObs)
  98. }
  99. if grantWriteAcpID := input.GrantWriteAcpId; grantWriteAcpID != "" {
  100. setHeaders(headers, HEADER_GRANT_WRITE_ACP_OBS, []string{grantWriteAcpID}, isObs)
  101. }
  102. if grantFullControlID := input.GrantFullControlId; grantFullControlID != "" {
  103. setHeaders(headers, HEADER_GRANT_FULL_CONTROL_OBS, []string{grantFullControlID}, isObs)
  104. }
  105. if grantReadDeliveredID := input.GrantReadDeliveredId; grantReadDeliveredID != "" {
  106. setHeaders(headers, HEADER_GRANT_READ_DELIVERED_OBS, []string{grantReadDeliveredID}, true)
  107. }
  108. if grantFullControlDeliveredID := input.GrantFullControlDeliveredId; grantFullControlDeliveredID != "" {
  109. setHeaders(headers, HEADER_GRANT_FULL_CONTROL_DELIVERED_OBS, []string{grantFullControlDeliveredID}, true)
  110. }
  111. }
  112. func (input CreateBucketInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  113. headers = make(map[string][]string)
  114. if acl := string(input.ACL); acl != "" {
  115. setHeaders(headers, HEADER_ACL, []string{acl}, isObs)
  116. }
  117. if storageClass := string(input.StorageClass); storageClass != "" {
  118. if !isObs {
  119. if storageClass == string(StorageClassWarm) {
  120. storageClass = string(storageClassStandardIA)
  121. } else if storageClass == string(StorageClassCold) {
  122. storageClass = string(storageClassGlacier)
  123. }
  124. }
  125. setHeadersNext(headers, HEADER_STORAGE_CLASS_OBS, HEADER_STORAGE_CLASS, []string{storageClass}, isObs)
  126. }
  127. if epid := input.Epid; epid != "" {
  128. setHeaders(headers, HEADER_EPID_HEADERS, []string{epid}, isObs)
  129. }
  130. if availableZone := input.AvailableZone; availableZone != "" {
  131. setHeaders(headers, HEADER_AZ_REDUNDANCY, []string{availableZone}, isObs)
  132. }
  133. input.prepareGrantHeaders(headers, isObs)
  134. if location := strings.TrimSpace(input.Location); location != "" {
  135. input.Location = location
  136. xml := make([]string, 0, 3)
  137. xml = append(xml, "<CreateBucketConfiguration>")
  138. if isObs {
  139. xml = append(xml, fmt.Sprintf("<Location>%s</Location>", input.Location))
  140. } else {
  141. xml = append(xml, fmt.Sprintf("<LocationConstraint>%s</LocationConstraint>", input.Location))
  142. }
  143. xml = append(xml, "</CreateBucketConfiguration>")
  144. data = strings.Join(xml, "")
  145. }
  146. return
  147. }
  148. func (input SetBucketStoragePolicyInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  149. xml := make([]string, 0, 1)
  150. if !isObs {
  151. storageClass := "STANDARD"
  152. if input.StorageClass == StorageClassWarm {
  153. storageClass = string(storageClassStandardIA)
  154. } else if input.StorageClass == StorageClassCold {
  155. storageClass = string(storageClassGlacier)
  156. }
  157. params = map[string]string{string(SubResourceStoragePolicy): ""}
  158. xml = append(xml, fmt.Sprintf("<StoragePolicy><DefaultStorageClass>%s</DefaultStorageClass></StoragePolicy>", storageClass))
  159. } else {
  160. if input.StorageClass != StorageClassWarm && input.StorageClass != StorageClassCold {
  161. input.StorageClass = StorageClassStandard
  162. }
  163. params = map[string]string{string(SubResourceStorageClass): ""}
  164. xml = append(xml, fmt.Sprintf("<StorageClass>%s</StorageClass>", input.StorageClass))
  165. }
  166. data = strings.Join(xml, "")
  167. return
  168. }
  169. func (input ListObjsInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  170. params = make(map[string]string)
  171. if input.Prefix != "" {
  172. params["prefix"] = input.Prefix
  173. }
  174. if input.Delimiter != "" {
  175. params["delimiter"] = input.Delimiter
  176. }
  177. if input.MaxKeys > 0 {
  178. params["max-keys"] = IntToString(input.MaxKeys)
  179. }
  180. headers = make(map[string][]string)
  181. if origin := strings.TrimSpace(input.Origin); origin != "" {
  182. headers[HEADER_ORIGIN_CAMEL] = []string{origin}
  183. }
  184. if requestHeader := strings.TrimSpace(input.RequestHeader); requestHeader != "" {
  185. headers[HEADER_ACCESS_CONTROL_REQUEST_HEADER_CAMEL] = []string{requestHeader}
  186. }
  187. return
  188. }
  189. func (input ListObjectsInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  190. params, headers, data, err = input.ListObjsInput.trans(isObs)
  191. if err != nil {
  192. return
  193. }
  194. if input.Marker != "" {
  195. params["marker"] = input.Marker
  196. }
  197. return
  198. }
  199. func (input ListVersionsInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  200. params, headers, data, err = input.ListObjsInput.trans(isObs)
  201. if err != nil {
  202. return
  203. }
  204. params[string(SubResourceVersions)] = ""
  205. if input.KeyMarker != "" {
  206. params["key-marker"] = input.KeyMarker
  207. }
  208. if input.VersionIdMarker != "" {
  209. params["version-id-marker"] = input.VersionIdMarker
  210. }
  211. return
  212. }
  213. func (input ListMultipartUploadsInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  214. params = map[string]string{string(SubResourceUploads): ""}
  215. if input.Prefix != "" {
  216. params["prefix"] = input.Prefix
  217. }
  218. if input.Delimiter != "" {
  219. params["delimiter"] = input.Delimiter
  220. }
  221. if input.MaxUploads > 0 {
  222. params["max-uploads"] = IntToString(input.MaxUploads)
  223. }
  224. if input.KeyMarker != "" {
  225. params["key-marker"] = input.KeyMarker
  226. }
  227. if input.UploadIdMarker != "" {
  228. params["upload-id-marker"] = input.UploadIdMarker
  229. }
  230. return
  231. }
  232. func (input SetBucketQuotaInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  233. return trans(SubResourceQuota, input)
  234. }
  235. func (input SetBucketAclInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  236. params = map[string]string{string(SubResourceAcl): ""}
  237. headers = make(map[string][]string)
  238. if acl := string(input.ACL); acl != "" {
  239. setHeaders(headers, HEADER_ACL, []string{acl}, isObs)
  240. } else {
  241. data, _ = convertBucketACLToXML(input.AccessControlPolicy, false, isObs)
  242. }
  243. return
  244. }
  245. func (input SetBucketPolicyInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  246. params = map[string]string{string(SubResourcePolicy): ""}
  247. data = strings.NewReader(input.Policy)
  248. return
  249. }
  250. func (input SetBucketCorsInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  251. params = map[string]string{string(SubResourceCors): ""}
  252. data, md5, err := ConvertRequestToIoReaderV2(input)
  253. if err != nil {
  254. return
  255. }
  256. headers = map[string][]string{HEADER_MD5_CAMEL: {md5}}
  257. return
  258. }
  259. func (input SetBucketVersioningInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  260. return trans(SubResourceVersioning, input)
  261. }
  262. func (input SetBucketWebsiteConfigurationInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  263. params = map[string]string{string(SubResourceWebsite): ""}
  264. data, _ = ConvertWebsiteConfigurationToXml(input.BucketWebsiteConfiguration, false)
  265. return
  266. }
  267. func (input GetBucketMetadataInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  268. headers = make(map[string][]string)
  269. if origin := strings.TrimSpace(input.Origin); origin != "" {
  270. headers[HEADER_ORIGIN_CAMEL] = []string{origin}
  271. }
  272. if requestHeader := strings.TrimSpace(input.RequestHeader); requestHeader != "" {
  273. headers[HEADER_ACCESS_CONTROL_REQUEST_HEADER_CAMEL] = []string{requestHeader}
  274. }
  275. return
  276. }
  277. func (input SetBucketLoggingConfigurationInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  278. params = map[string]string{string(SubResourceLogging): ""}
  279. data, _ = ConvertLoggingStatusToXml(input.BucketLoggingStatus, false, isObs)
  280. return
  281. }
  282. func (input SetBucketLifecycleConfigurationInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  283. params = map[string]string{string(SubResourceLifecycle): ""}
  284. data, md5 := ConvertLifecyleConfigurationToXml(input.BucketLifecyleConfiguration, true, isObs)
  285. headers = map[string][]string{HEADER_MD5_CAMEL: {md5}}
  286. return
  287. }
  288. func (input SetBucketTaggingInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  289. params = map[string]string{string(SubResourceTagging): ""}
  290. data, md5, err := ConvertRequestToIoReaderV2(input)
  291. if err != nil {
  292. return
  293. }
  294. headers = map[string][]string{HEADER_MD5_CAMEL: {md5}}
  295. return
  296. }
  297. func (input SetBucketNotificationInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  298. params = map[string]string{string(SubResourceNotification): ""}
  299. data, _ = ConvertNotificationToXml(input.BucketNotification, false, isObs)
  300. return
  301. }
  302. func (input DeleteObjectInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  303. params = make(map[string]string)
  304. if input.VersionId != "" {
  305. params[PARAM_VERSION_ID] = input.VersionId
  306. }
  307. return
  308. }
  309. func (input DeleteObjectsInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  310. params = map[string]string{string(SubResourceDelete): ""}
  311. data, md5, err := ConvertRequestToIoReaderV2(input)
  312. if err != nil {
  313. return
  314. }
  315. headers = map[string][]string{HEADER_MD5_CAMEL: {md5}}
  316. return
  317. }
  318. func (input SetObjectAclInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  319. params = map[string]string{string(SubResourceAcl): ""}
  320. if input.VersionId != "" {
  321. params[PARAM_VERSION_ID] = input.VersionId
  322. }
  323. headers = make(map[string][]string)
  324. if acl := string(input.ACL); acl != "" {
  325. setHeaders(headers, HEADER_ACL, []string{acl}, isObs)
  326. } else {
  327. data, _ = ConvertAclToXml(input.AccessControlPolicy, false, isObs)
  328. }
  329. return
  330. }
  331. func (input GetObjectAclInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  332. params = map[string]string{string(SubResourceAcl): ""}
  333. if input.VersionId != "" {
  334. params[PARAM_VERSION_ID] = input.VersionId
  335. }
  336. return
  337. }
  338. func (input RestoreObjectInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  339. params = map[string]string{string(SubResourceRestore): ""}
  340. if input.VersionId != "" {
  341. params[PARAM_VERSION_ID] = input.VersionId
  342. }
  343. if !isObs {
  344. data, err = ConvertRequestToIoReader(input)
  345. } else {
  346. data = ConverntObsRestoreToXml(input)
  347. }
  348. return
  349. }
  350. // GetEncryption gets the Encryption field value from SseKmsHeader
  351. func (header SseKmsHeader) GetEncryption() string {
  352. if header.Encryption != "" {
  353. return header.Encryption
  354. }
  355. if !header.isObs {
  356. return DEFAULT_SSE_KMS_ENCRYPTION
  357. }
  358. return DEFAULT_SSE_KMS_ENCRYPTION_OBS
  359. }
  360. // GetKey gets the Key field value from SseKmsHeader
  361. func (header SseKmsHeader) GetKey() string {
  362. return header.Key
  363. }
  364. // GetEncryption gets the Encryption field value from SseCHeader
  365. func (header SseCHeader) GetEncryption() string {
  366. if header.Encryption != "" {
  367. return header.Encryption
  368. }
  369. return DEFAULT_SSE_C_ENCRYPTION
  370. }
  371. // GetKey gets the Key field value from SseCHeader
  372. func (header SseCHeader) GetKey() string {
  373. return header.Key
  374. }
  375. // GetKeyMD5 gets the KeyMD5 field value from SseCHeader
  376. func (header SseCHeader) GetKeyMD5() string {
  377. if header.KeyMD5 != "" {
  378. return header.KeyMD5
  379. }
  380. if ret, err := Base64Decode(header.GetKey()); err == nil {
  381. return Base64Md5(ret)
  382. }
  383. return ""
  384. }
  385. func setSseHeader(headers map[string][]string, sseHeader ISseHeader, sseCOnly bool, isObs bool) {
  386. if sseHeader != nil {
  387. if sseCHeader, ok := sseHeader.(SseCHeader); ok {
  388. setHeaders(headers, HEADER_SSEC_ENCRYPTION, []string{sseCHeader.GetEncryption()}, isObs)
  389. setHeaders(headers, HEADER_SSEC_KEY, []string{sseCHeader.GetKey()}, isObs)
  390. setHeaders(headers, HEADER_SSEC_KEY_MD5, []string{sseCHeader.GetKeyMD5()}, isObs)
  391. } else if sseKmsHeader, ok := sseHeader.(SseKmsHeader); !sseCOnly && ok {
  392. sseKmsHeader.isObs = isObs
  393. setHeaders(headers, HEADER_SSEKMS_ENCRYPTION, []string{sseKmsHeader.GetEncryption()}, isObs)
  394. if sseKmsHeader.GetKey() != "" {
  395. setHeadersNext(headers, HEADER_SSEKMS_KEY_OBS, HEADER_SSEKMS_KEY_AMZ, []string{sseKmsHeader.GetKey()}, isObs)
  396. }
  397. }
  398. }
  399. }
  400. func (input GetObjectMetadataInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  401. params = make(map[string]string)
  402. if input.VersionId != "" {
  403. params[PARAM_VERSION_ID] = input.VersionId
  404. }
  405. headers = make(map[string][]string)
  406. if input.Origin != "" {
  407. headers[HEADER_ORIGIN_CAMEL] = []string{input.Origin}
  408. }
  409. if input.RequestHeader != "" {
  410. headers[HEADER_ACCESS_CONTROL_REQUEST_HEADER_CAMEL] = []string{input.RequestHeader}
  411. }
  412. setSseHeader(headers, input.SseHeader, true, isObs)
  413. return
  414. }
  415. func (input SetObjectMetadataInput) prepareContentHeaders(headers map[string][]string) {
  416. if input.ContentDisposition != "" {
  417. headers[HEADER_CONTENT_DISPOSITION_CAMEL] = []string{input.ContentDisposition}
  418. }
  419. if input.ContentEncoding != "" {
  420. headers[HEADER_CONTENT_ENCODING_CAMEL] = []string{input.ContentEncoding}
  421. }
  422. if input.ContentLanguage != "" {
  423. headers[HEADER_CONTENT_LANGUAGE_CAMEL] = []string{input.ContentLanguage}
  424. }
  425. if input.ContentType != "" {
  426. headers[HEADER_CONTENT_TYPE_CAML] = []string{input.ContentType}
  427. }
  428. }
  429. func (input SetObjectMetadataInput) prepareStorageClass(headers map[string][]string, isObs bool) {
  430. if storageClass := string(input.StorageClass); storageClass != "" {
  431. if !isObs {
  432. if storageClass == string(StorageClassWarm) {
  433. storageClass = string(storageClassStandardIA)
  434. } else if storageClass == string(StorageClassCold) {
  435. storageClass = string(storageClassGlacier)
  436. }
  437. }
  438. setHeaders(headers, HEADER_STORAGE_CLASS2, []string{storageClass}, isObs)
  439. }
  440. }
  441. func (input SetObjectMetadataInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  442. params = make(map[string]string)
  443. params = map[string]string{string(SubResourceMetadata): ""}
  444. if input.VersionId != "" {
  445. params[PARAM_VERSION_ID] = input.VersionId
  446. }
  447. headers = make(map[string][]string)
  448. if directive := string(input.MetadataDirective); directive != "" {
  449. setHeaders(headers, HEADER_METADATA_DIRECTIVE, []string{string(input.MetadataDirective)}, isObs)
  450. } else {
  451. setHeaders(headers, HEADER_METADATA_DIRECTIVE, []string{string(ReplaceNew)}, isObs)
  452. }
  453. if input.CacheControl != "" {
  454. headers[HEADER_CACHE_CONTROL_CAMEL] = []string{input.CacheControl}
  455. }
  456. input.prepareContentHeaders(headers)
  457. if input.Expires != "" {
  458. headers[HEADER_EXPIRES_CAMEL] = []string{input.Expires}
  459. }
  460. if input.WebsiteRedirectLocation != "" {
  461. setHeaders(headers, HEADER_WEBSITE_REDIRECT_LOCATION, []string{input.WebsiteRedirectLocation}, isObs)
  462. }
  463. input.prepareStorageClass(headers, isObs)
  464. if input.Metadata != nil {
  465. for key, value := range input.Metadata {
  466. key = strings.TrimSpace(key)
  467. setHeadersNext(headers, HEADER_PREFIX_META_OBS+key, HEADER_PREFIX_META+key, []string{value}, isObs)
  468. }
  469. }
  470. return
  471. }
  472. func (input GetObjectInput) prepareResponseParams(params map[string]string) {
  473. if input.ResponseCacheControl != "" {
  474. params[PARAM_RESPONSE_CACHE_CONTROL] = input.ResponseCacheControl
  475. }
  476. if input.ResponseContentDisposition != "" {
  477. params[PARAM_RESPONSE_CONTENT_DISPOSITION] = input.ResponseContentDisposition
  478. }
  479. if input.ResponseContentEncoding != "" {
  480. params[PARAM_RESPONSE_CONTENT_ENCODING] = input.ResponseContentEncoding
  481. }
  482. if input.ResponseContentLanguage != "" {
  483. params[PARAM_RESPONSE_CONTENT_LANGUAGE] = input.ResponseContentLanguage
  484. }
  485. if input.ResponseContentType != "" {
  486. params[PARAM_RESPONSE_CONTENT_TYPE] = input.ResponseContentType
  487. }
  488. if input.ResponseExpires != "" {
  489. params[PARAM_RESPONSE_EXPIRES] = input.ResponseExpires
  490. }
  491. }
  492. func (input GetObjectInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  493. params, headers, data, err = input.GetObjectMetadataInput.trans(isObs)
  494. if err != nil {
  495. return
  496. }
  497. input.prepareResponseParams(params)
  498. if input.ImageProcess != "" {
  499. params[PARAM_IMAGE_PROCESS] = input.ImageProcess
  500. }
  501. if input.RangeStart >= 0 && input.RangeEnd > input.RangeStart {
  502. headers[HEADER_RANGE] = []string{fmt.Sprintf("bytes=%d-%d", input.RangeStart, input.RangeEnd)}
  503. }
  504. if input.IfMatch != "" {
  505. headers[HEADER_IF_MATCH] = []string{input.IfMatch}
  506. }
  507. if input.IfNoneMatch != "" {
  508. headers[HEADER_IF_NONE_MATCH] = []string{input.IfNoneMatch}
  509. }
  510. if !input.IfModifiedSince.IsZero() {
  511. headers[HEADER_IF_MODIFIED_SINCE] = []string{FormatUtcToRfc1123(input.IfModifiedSince)}
  512. }
  513. if !input.IfUnmodifiedSince.IsZero() {
  514. headers[HEADER_IF_UNMODIFIED_SINCE] = []string{FormatUtcToRfc1123(input.IfUnmodifiedSince)}
  515. }
  516. return
  517. }
  518. func (input ObjectOperationInput) prepareGrantHeaders(headers map[string][]string) {
  519. if GrantReadID := input.GrantReadId; GrantReadID != "" {
  520. setHeaders(headers, HEADER_GRANT_READ_OBS, []string{GrantReadID}, true)
  521. }
  522. if GrantReadAcpID := input.GrantReadAcpId; GrantReadAcpID != "" {
  523. setHeaders(headers, HEADER_GRANT_READ_ACP_OBS, []string{GrantReadAcpID}, true)
  524. }
  525. if GrantWriteAcpID := input.GrantWriteAcpId; GrantWriteAcpID != "" {
  526. setHeaders(headers, HEADER_GRANT_WRITE_ACP_OBS, []string{GrantWriteAcpID}, true)
  527. }
  528. if GrantFullControlID := input.GrantFullControlId; GrantFullControlID != "" {
  529. setHeaders(headers, HEADER_GRANT_FULL_CONTROL_OBS, []string{GrantFullControlID}, true)
  530. }
  531. }
  532. func (input ObjectOperationInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  533. headers = make(map[string][]string)
  534. params = make(map[string]string)
  535. if acl := string(input.ACL); acl != "" {
  536. setHeaders(headers, HEADER_ACL, []string{acl}, isObs)
  537. }
  538. input.prepareGrantHeaders(headers)
  539. if storageClass := string(input.StorageClass); storageClass != "" {
  540. if !isObs {
  541. if storageClass == string(StorageClassWarm) {
  542. storageClass = string(storageClassStandardIA)
  543. } else if storageClass == string(StorageClassCold) {
  544. storageClass = string(storageClassGlacier)
  545. }
  546. }
  547. setHeaders(headers, HEADER_STORAGE_CLASS2, []string{storageClass}, isObs)
  548. }
  549. if input.WebsiteRedirectLocation != "" {
  550. setHeaders(headers, HEADER_WEBSITE_REDIRECT_LOCATION, []string{input.WebsiteRedirectLocation}, isObs)
  551. }
  552. setSseHeader(headers, input.SseHeader, false, isObs)
  553. if input.Expires != 0 {
  554. setHeaders(headers, HEADER_EXPIRES, []string{Int64ToString(input.Expires)}, true)
  555. }
  556. if input.Metadata != nil {
  557. for key, value := range input.Metadata {
  558. key = strings.TrimSpace(key)
  559. setHeadersNext(headers, HEADER_PREFIX_META_OBS+key, HEADER_PREFIX_META+key, []string{value}, isObs)
  560. }
  561. }
  562. return
  563. }
  564. func (input PutObjectBasicInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  565. params, headers, data, err = input.ObjectOperationInput.trans(isObs)
  566. if err != nil {
  567. return
  568. }
  569. if input.ContentMD5 != "" {
  570. headers[HEADER_MD5_CAMEL] = []string{input.ContentMD5}
  571. }
  572. if input.ContentLength > 0 {
  573. headers[HEADER_CONTENT_LENGTH_CAMEL] = []string{Int64ToString(input.ContentLength)}
  574. }
  575. if input.ContentType != "" {
  576. headers[HEADER_CONTENT_TYPE_CAML] = []string{input.ContentType}
  577. }
  578. return
  579. }
  580. func (input PutObjectInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  581. params, headers, data, err = input.PutObjectBasicInput.trans(isObs)
  582. if err != nil {
  583. return
  584. }
  585. if input.Body != nil {
  586. data = input.Body
  587. }
  588. return
  589. }
  590. func (input CopyObjectInput) prepareReplaceHeaders(headers map[string][]string) {
  591. if input.CacheControl != "" {
  592. headers[HEADER_CACHE_CONTROL] = []string{input.CacheControl}
  593. }
  594. if input.ContentDisposition != "" {
  595. headers[HEADER_CONTENT_DISPOSITION] = []string{input.ContentDisposition}
  596. }
  597. if input.ContentEncoding != "" {
  598. headers[HEADER_CONTENT_ENCODING] = []string{input.ContentEncoding}
  599. }
  600. if input.ContentLanguage != "" {
  601. headers[HEADER_CONTENT_LANGUAGE] = []string{input.ContentLanguage}
  602. }
  603. if input.ContentType != "" {
  604. headers[HEADER_CONTENT_TYPE] = []string{input.ContentType}
  605. }
  606. if input.Expires != "" {
  607. headers[HEADER_EXPIRES] = []string{input.Expires}
  608. }
  609. }
  610. func (input CopyObjectInput) prepareCopySourceHeaders(headers map[string][]string, isObs bool) {
  611. if input.CopySourceIfMatch != "" {
  612. setHeaders(headers, HEADER_COPY_SOURCE_IF_MATCH, []string{input.CopySourceIfMatch}, isObs)
  613. }
  614. if input.CopySourceIfNoneMatch != "" {
  615. setHeaders(headers, HEADER_COPY_SOURCE_IF_NONE_MATCH, []string{input.CopySourceIfNoneMatch}, isObs)
  616. }
  617. if !input.CopySourceIfModifiedSince.IsZero() {
  618. setHeaders(headers, HEADER_COPY_SOURCE_IF_MODIFIED_SINCE, []string{FormatUtcToRfc1123(input.CopySourceIfModifiedSince)}, isObs)
  619. }
  620. if !input.CopySourceIfUnmodifiedSince.IsZero() {
  621. setHeaders(headers, HEADER_COPY_SOURCE_IF_UNMODIFIED_SINCE, []string{FormatUtcToRfc1123(input.CopySourceIfUnmodifiedSince)}, isObs)
  622. }
  623. }
  624. func (input CopyObjectInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  625. params, headers, data, err = input.ObjectOperationInput.trans(isObs)
  626. if err != nil {
  627. return
  628. }
  629. var copySource string
  630. if input.CopySourceVersionId != "" {
  631. copySource = fmt.Sprintf("%s/%s?versionId=%s", input.CopySourceBucket, UrlEncode(input.CopySourceKey, false), input.CopySourceVersionId)
  632. } else {
  633. copySource = fmt.Sprintf("%s/%s", input.CopySourceBucket, UrlEncode(input.CopySourceKey, false))
  634. }
  635. setHeaders(headers, HEADER_COPY_SOURCE, []string{copySource}, isObs)
  636. if directive := string(input.MetadataDirective); directive != "" {
  637. setHeaders(headers, HEADER_METADATA_DIRECTIVE, []string{directive}, isObs)
  638. }
  639. if input.MetadataDirective == ReplaceMetadata {
  640. input.prepareReplaceHeaders(headers)
  641. }
  642. input.prepareCopySourceHeaders(headers, isObs)
  643. if input.SourceSseHeader != nil {
  644. if sseCHeader, ok := input.SourceSseHeader.(SseCHeader); ok {
  645. setHeaders(headers, HEADER_SSEC_COPY_SOURCE_ENCRYPTION, []string{sseCHeader.GetEncryption()}, isObs)
  646. setHeaders(headers, HEADER_SSEC_COPY_SOURCE_KEY, []string{sseCHeader.GetKey()}, isObs)
  647. setHeaders(headers, HEADER_SSEC_COPY_SOURCE_KEY_MD5, []string{sseCHeader.GetKeyMD5()}, isObs)
  648. }
  649. }
  650. if input.SuccessActionRedirect != "" {
  651. headers[HEADER_SUCCESS_ACTION_REDIRECT] = []string{input.SuccessActionRedirect}
  652. }
  653. return
  654. }
  655. func (input AbortMultipartUploadInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  656. params = map[string]string{"uploadId": input.UploadId}
  657. return
  658. }
  659. func (input InitiateMultipartUploadInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  660. params, headers, data, err = input.ObjectOperationInput.trans(isObs)
  661. if err != nil {
  662. return
  663. }
  664. if input.ContentType != "" {
  665. headers[HEADER_CONTENT_TYPE_CAML] = []string{input.ContentType}
  666. }
  667. params[string(SubResourceUploads)] = ""
  668. return
  669. }
  670. func (input UploadPartInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  671. params = map[string]string{"uploadId": input.UploadId, "partNumber": IntToString(input.PartNumber)}
  672. headers = make(map[string][]string)
  673. setSseHeader(headers, input.SseHeader, true, isObs)
  674. if input.ContentMD5 != "" {
  675. headers[HEADER_MD5_CAMEL] = []string{input.ContentMD5}
  676. }
  677. if input.Body != nil {
  678. data = input.Body
  679. }
  680. return
  681. }
  682. func (input CompleteMultipartUploadInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  683. params = map[string]string{"uploadId": input.UploadId}
  684. data, _ = ConvertCompleteMultipartUploadInputToXml(input, false)
  685. return
  686. }
  687. func (input ListPartsInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  688. params = map[string]string{"uploadId": input.UploadId}
  689. if input.MaxParts > 0 {
  690. params["max-parts"] = IntToString(input.MaxParts)
  691. }
  692. if input.PartNumberMarker > 0 {
  693. params["part-number-marker"] = IntToString(input.PartNumberMarker)
  694. }
  695. return
  696. }
  697. func (input CopyPartInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  698. params = map[string]string{"uploadId": input.UploadId, "partNumber": IntToString(input.PartNumber)}
  699. headers = make(map[string][]string, 1)
  700. var copySource string
  701. if input.CopySourceVersionId != "" {
  702. copySource = fmt.Sprintf("%s/%s?versionId=%s", input.CopySourceBucket, UrlEncode(input.CopySourceKey, false), input.CopySourceVersionId)
  703. } else {
  704. copySource = fmt.Sprintf("%s/%s", input.CopySourceBucket, UrlEncode(input.CopySourceKey, false))
  705. }
  706. setHeaders(headers, HEADER_COPY_SOURCE, []string{copySource}, isObs)
  707. if input.CopySourceRangeStart >= 0 && input.CopySourceRangeEnd > input.CopySourceRangeStart {
  708. setHeaders(headers, HEADER_COPY_SOURCE_RANGE, []string{fmt.Sprintf("bytes=%d-%d", input.CopySourceRangeStart, input.CopySourceRangeEnd)}, isObs)
  709. }
  710. setSseHeader(headers, input.SseHeader, true, isObs)
  711. if input.SourceSseHeader != nil {
  712. if sseCHeader, ok := input.SourceSseHeader.(SseCHeader); ok {
  713. setHeaders(headers, HEADER_SSEC_COPY_SOURCE_ENCRYPTION, []string{sseCHeader.GetEncryption()}, isObs)
  714. setHeaders(headers, HEADER_SSEC_COPY_SOURCE_KEY, []string{sseCHeader.GetKey()}, isObs)
  715. setHeaders(headers, HEADER_SSEC_COPY_SOURCE_KEY_MD5, []string{sseCHeader.GetKeyMD5()}, isObs)
  716. }
  717. }
  718. return
  719. }
  720. func (input HeadObjectInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  721. params = make(map[string]string)
  722. if input.VersionId != "" {
  723. params[PARAM_VERSION_ID] = input.VersionId
  724. }
  725. return
  726. }
  727. func (input SetBucketRequestPaymentInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  728. return trans(SubResourceRequestPayment, input)
  729. }
  730. type partSlice []Part
  731. func (parts partSlice) Len() int {
  732. return len(parts)
  733. }
  734. func (parts partSlice) Less(i, j int) bool {
  735. return parts[i].PartNumber < parts[j].PartNumber
  736. }
  737. func (parts partSlice) Swap(i, j int) {
  738. parts[i], parts[j] = parts[j], parts[i]
  739. }
  740. type readerWrapper struct {
  741. reader io.Reader
  742. mark int64
  743. totalCount int64
  744. readedCount int64
  745. }
  746. func (rw *readerWrapper) seek(offset int64, whence int) (int64, error) {
  747. if r, ok := rw.reader.(*strings.Reader); ok {
  748. return r.Seek(offset, whence)
  749. } else if r, ok := rw.reader.(*bytes.Reader); ok {
  750. return r.Seek(offset, whence)
  751. } else if r, ok := rw.reader.(*os.File); ok {
  752. return r.Seek(offset, whence)
  753. }
  754. return offset, nil
  755. }
  756. func (rw *readerWrapper) Read(p []byte) (n int, err error) {
  757. if rw.totalCount == 0 {
  758. return 0, io.EOF
  759. }
  760. if rw.totalCount > 0 {
  761. n, err = rw.reader.Read(p)
  762. readedOnce := int64(n)
  763. remainCount := rw.totalCount - rw.readedCount
  764. if remainCount > readedOnce {
  765. rw.readedCount += readedOnce
  766. return n, err
  767. }
  768. rw.readedCount += remainCount
  769. return int(remainCount), io.EOF
  770. }
  771. return rw.reader.Read(p)
  772. }
  773. type fileReaderWrapper struct {
  774. readerWrapper
  775. filePath string
  776. }
  777. func (input SetBucketFetchPolicyInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  778. contentType, _ := mimeTypes["json"]
  779. headers = make(map[string][]string, 2)
  780. headers[HEADER_CONTENT_TYPE] = []string{contentType}
  781. setHeaders(headers, headerOefMarker, []string{"yes"}, isObs)
  782. data, err = convertFetchPolicyToJSON(input)
  783. return
  784. }
  785. func (input GetBucketFetchPolicyInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  786. headers = make(map[string][]string, 1)
  787. setHeaders(headers, headerOefMarker, []string{"yes"}, isObs)
  788. return
  789. }
  790. func (input DeleteBucketFetchPolicyInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  791. headers = make(map[string][]string, 1)
  792. setHeaders(headers, headerOefMarker, []string{"yes"}, isObs)
  793. return
  794. }
  795. func (input SetBucketFetchJobInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  796. contentType, _ := mimeTypes["json"]
  797. headers = make(map[string][]string, 2)
  798. headers[HEADER_CONTENT_TYPE] = []string{contentType}
  799. setHeaders(headers, headerOefMarker, []string{"yes"}, isObs)
  800. data, err = convertFetchJobToJSON(input)
  801. return
  802. }
  803. func (input GetBucketFetchJobInput) trans(isObs bool) (params map[string]string, headers map[string][]string, data interface{}, err error) {
  804. headers = make(map[string][]string, 1)
  805. setHeaders(headers, headerOefMarker, []string{"yes"}, isObs)
  806. return
  807. }