type.go 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775
  1. package oss
  2. import (
  3. "encoding/xml"
  4. "fmt"
  5. "net/url"
  6. "time"
  7. )
  8. // ListBucketsResult defines the result object from ListBuckets request
  9. type ListBucketsResult struct {
  10. XMLName xml.Name `xml:"ListAllMyBucketsResult"`
  11. Prefix string `xml:"Prefix"` // The prefix in this query
  12. Marker string `xml:"Marker"` // The marker filter
  13. MaxKeys int `xml:"MaxKeys"` // The max entry count to return. This information is returned when IsTruncated is true.
  14. IsTruncated bool `xml:"IsTruncated"` // Flag true means there's remaining buckets to return.
  15. NextMarker string `xml:"NextMarker"` // The marker filter for the next list call
  16. Owner Owner `xml:"Owner"` // The owner information
  17. Buckets []BucketProperties `xml:"Buckets>Bucket"` // The bucket list
  18. }
  19. // BucketProperties defines bucket properties
  20. type BucketProperties struct {
  21. XMLName xml.Name `xml:"Bucket"`
  22. Name string `xml:"Name"` // Bucket name
  23. Location string `xml:"Location"` // Bucket datacenter
  24. CreationDate time.Time `xml:"CreationDate"` // Bucket create time
  25. StorageClass string `xml:"StorageClass"` // Bucket storage class
  26. }
  27. // GetBucketACLResult defines GetBucketACL request's result
  28. type GetBucketACLResult struct {
  29. XMLName xml.Name `xml:"AccessControlPolicy"`
  30. ACL string `xml:"AccessControlList>Grant"` // Bucket ACL
  31. Owner Owner `xml:"Owner"` // Bucket owner
  32. }
  33. // LifecycleConfiguration is the Bucket Lifecycle configuration
  34. type LifecycleConfiguration struct {
  35. XMLName xml.Name `xml:"LifecycleConfiguration"`
  36. Rules []LifecycleRule `xml:"Rule"`
  37. }
  38. // LifecycleRule defines Lifecycle rules
  39. type LifecycleRule struct {
  40. XMLName xml.Name `xml:"Rule"`
  41. ID string `xml:"ID,omitempty"` // The rule ID
  42. Prefix string `xml:"Prefix"` // The object key prefix
  43. Status string `xml:"Status"` // The rule status (enabled or not)
  44. Tags []Tag `xml:"Tag,omitempty"` // the tags property
  45. Expiration *LifecycleExpiration `xml:"Expiration,omitempty"` // The expiration property
  46. Transitions []LifecycleTransition `xml:"Transition,omitempty"` // The transition property
  47. AbortMultipartUpload *LifecycleAbortMultipartUpload `xml:"AbortMultipartUpload,omitempty"` // The AbortMultipartUpload property
  48. }
  49. // LifecycleExpiration defines the rule's expiration property
  50. type LifecycleExpiration struct {
  51. XMLName xml.Name `xml:"Expiration"`
  52. Days int `xml:"Days,omitempty"` // Relative expiration time: The expiration time in days after the last modified time
  53. Date string `xml:"Date,omitempty"` // Absolute expiration time: The expiration time in date, not recommended
  54. CreatedBeforeDate string `xml:"CreatedBeforeDate,omitempty"` // objects created before the date will be expired
  55. }
  56. // LifecycleTransition defines the rule's transition propery
  57. type LifecycleTransition struct {
  58. XMLName xml.Name `xml:"Transition"`
  59. Days int `xml:"Days,omitempty"` // Relative transition time: The transition time in days after the last modified time
  60. CreatedBeforeDate string `xml:"CreatedBeforeDate,omitempty"` // objects created before the date will be expired
  61. StorageClass StorageClassType `xml:"StorageClass,omitempty"` // Specifies the target storage type
  62. }
  63. // LifecycleAbortMultipartUpload defines the rule's abort multipart upload propery
  64. type LifecycleAbortMultipartUpload struct {
  65. XMLName xml.Name `xml:"AbortMultipartUpload"`
  66. Days int `xml:"Days,omitempty"` // Relative expiration time: The expiration time in days after the last modified time
  67. CreatedBeforeDate string `xml:"CreatedBeforeDate,omitempty"` // objects created before the date will be expired
  68. }
  69. const iso8601DateFormat = "2006-01-02T15:04:05.000Z"
  70. // BuildLifecycleRuleByDays builds a lifecycle rule objects will expiration in days after the last modified time
  71. func BuildLifecycleRuleByDays(id, prefix string, status bool, days int) LifecycleRule {
  72. var statusStr = "Enabled"
  73. if !status {
  74. statusStr = "Disabled"
  75. }
  76. return LifecycleRule{ID: id, Prefix: prefix, Status: statusStr,
  77. Expiration: &LifecycleExpiration{Days: days}}
  78. }
  79. // BuildLifecycleRuleByDate builds a lifecycle rule objects will expiration in specified date
  80. func BuildLifecycleRuleByDate(id, prefix string, status bool, year, month, day int) LifecycleRule {
  81. var statusStr = "Enabled"
  82. if !status {
  83. statusStr = "Disabled"
  84. }
  85. date := time.Date(year, time.Month(month), day, 0, 0, 0, 0, time.UTC).Format(iso8601DateFormat)
  86. return LifecycleRule{ID: id, Prefix: prefix, Status: statusStr,
  87. Expiration: &LifecycleExpiration{Date: date}}
  88. }
  89. // ValidateLifecycleRule Determine if a lifecycle rule is valid, if it is invalid, it will return an error.
  90. func verifyLifecycleRules(rules []LifecycleRule) error {
  91. if len(rules) == 0 {
  92. return fmt.Errorf("invalid rules, the length of rules is zero")
  93. }
  94. for _, rule := range rules {
  95. if rule.Status != "Enabled" && rule.Status != "Disabled" {
  96. return fmt.Errorf("invalid rule, the value of status must be Enabled or Disabled")
  97. }
  98. expiration := rule.Expiration
  99. if expiration != nil {
  100. if (expiration.Days != 0 && expiration.CreatedBeforeDate != "") || (expiration.Days != 0 && expiration.Date != "") || (expiration.CreatedBeforeDate != "" && expiration.Date != "") || (expiration.Days == 0 && expiration.CreatedBeforeDate == "" && expiration.Date == "") {
  101. return fmt.Errorf("invalid expiration lifecycle, must be set one of CreatedBeforeDate, Days and Date")
  102. }
  103. }
  104. abortMPU := rule.AbortMultipartUpload
  105. if abortMPU != nil {
  106. if (abortMPU.Days != 0 && abortMPU.CreatedBeforeDate != "") || (abortMPU.Days == 0 && abortMPU.CreatedBeforeDate == "") {
  107. return fmt.Errorf("invalid abort multipart upload lifecycle, must be set one of CreatedBeforeDate and Days")
  108. }
  109. }
  110. transitions := rule.Transitions
  111. if len(transitions) > 0 {
  112. if len(transitions) > 2 {
  113. return fmt.Errorf("invalid count of transition lifecycles, the count must than less than 3")
  114. }
  115. for _, transition := range transitions {
  116. if (transition.Days != 0 && transition.CreatedBeforeDate != "") || (transition.Days == 0 && transition.CreatedBeforeDate == "") {
  117. return fmt.Errorf("invalid transition lifecycle, must be set one of CreatedBeforeDate and Days")
  118. }
  119. if transition.StorageClass != StorageIA && transition.StorageClass != StorageArchive {
  120. return fmt.Errorf("invalid transition lifecylce, the value of storage class must be IA or Archive")
  121. }
  122. }
  123. } else if expiration == nil && abortMPU == nil {
  124. return fmt.Errorf("invalid rule, must set one of Expiration, AbortMultipartUplaod and Transitions")
  125. }
  126. }
  127. return nil
  128. }
  129. // GetBucketLifecycleResult defines GetBucketLifecycle's result object
  130. type GetBucketLifecycleResult LifecycleConfiguration
  131. // RefererXML defines Referer configuration
  132. type RefererXML struct {
  133. XMLName xml.Name `xml:"RefererConfiguration"`
  134. AllowEmptyReferer bool `xml:"AllowEmptyReferer"` // Allow empty referrer
  135. RefererList []string `xml:"RefererList>Referer"` // Referer whitelist
  136. }
  137. // GetBucketRefererResult defines result object for GetBucketReferer request
  138. type GetBucketRefererResult RefererXML
  139. // LoggingXML defines logging configuration
  140. type LoggingXML struct {
  141. XMLName xml.Name `xml:"BucketLoggingStatus"`
  142. LoggingEnabled LoggingEnabled `xml:"LoggingEnabled"` // The logging configuration information
  143. }
  144. type loggingXMLEmpty struct {
  145. XMLName xml.Name `xml:"BucketLoggingStatus"`
  146. }
  147. // LoggingEnabled defines the logging configuration information
  148. type LoggingEnabled struct {
  149. XMLName xml.Name `xml:"LoggingEnabled"`
  150. TargetBucket string `xml:"TargetBucket"` // The bucket name for storing the log files
  151. TargetPrefix string `xml:"TargetPrefix"` // The log file prefix
  152. }
  153. // GetBucketLoggingResult defines the result from GetBucketLogging request
  154. type GetBucketLoggingResult LoggingXML
  155. // WebsiteXML defines Website configuration
  156. type WebsiteXML struct {
  157. XMLName xml.Name `xml:"WebsiteConfiguration"`
  158. IndexDocument IndexDocument `xml:"IndexDocument"` // The index page
  159. ErrorDocument ErrorDocument `xml:"ErrorDocument"` // The error page
  160. }
  161. // IndexDocument defines the index page info
  162. type IndexDocument struct {
  163. XMLName xml.Name `xml:"IndexDocument"`
  164. Suffix string `xml:"Suffix"` // The file name for the index page
  165. }
  166. // ErrorDocument defines the 404 error page info
  167. type ErrorDocument struct {
  168. XMLName xml.Name `xml:"ErrorDocument"`
  169. Key string `xml:"Key"` // 404 error file name
  170. }
  171. // GetBucketWebsiteResult defines the result from GetBucketWebsite request.
  172. type GetBucketWebsiteResult WebsiteXML
  173. // CORSXML defines CORS configuration
  174. type CORSXML struct {
  175. XMLName xml.Name `xml:"CORSConfiguration"`
  176. CORSRules []CORSRule `xml:"CORSRule"` // CORS rules
  177. }
  178. // CORSRule defines CORS rules
  179. type CORSRule struct {
  180. XMLName xml.Name `xml:"CORSRule"`
  181. AllowedOrigin []string `xml:"AllowedOrigin"` // Allowed origins. By default it's wildcard '*'
  182. AllowedMethod []string `xml:"AllowedMethod"` // Allowed methods
  183. AllowedHeader []string `xml:"AllowedHeader"` // Allowed headers
  184. ExposeHeader []string `xml:"ExposeHeader"` // Allowed response headers
  185. MaxAgeSeconds int `xml:"MaxAgeSeconds"` // Max cache ages in seconds
  186. }
  187. // GetBucketCORSResult defines the result from GetBucketCORS request.
  188. type GetBucketCORSResult CORSXML
  189. // GetBucketInfoResult defines the result from GetBucketInfo request.
  190. type GetBucketInfoResult struct {
  191. XMLName xml.Name `xml:"BucketInfo"`
  192. BucketInfo BucketInfo `xml:"Bucket"`
  193. }
  194. // BucketInfo defines Bucket information
  195. type BucketInfo struct {
  196. XMLName xml.Name `xml:"Bucket"`
  197. Name string `xml:"Name"` // Bucket name
  198. Location string `xml:"Location"` // Bucket datacenter
  199. CreationDate time.Time `xml:"CreationDate"` // Bucket creation time
  200. ExtranetEndpoint string `xml:"ExtranetEndpoint"` // Bucket external endpoint
  201. IntranetEndpoint string `xml:"IntranetEndpoint"` // Bucket internal endpoint
  202. ACL string `xml:"AccessControlList>Grant"` // Bucket ACL
  203. Owner Owner `xml:"Owner"` // Bucket owner
  204. StorageClass string `xml:"StorageClass"` // Bucket storage class
  205. SseRule SSERule `xml:"ServerSideEncryptionRule"` // Bucket ServerSideEncryptionRule
  206. Versioning string `xml:"Versioning"` // Bucket Versioning
  207. }
  208. type SSERule struct {
  209. XMLName xml.Name `xml:"ServerSideEncryptionRule"` // Bucket ServerSideEncryptionRule
  210. KMSMasterKeyID string `xml:"KMSMasterKeyID"` // Bucket KMSMasterKeyID
  211. SSEAlgorithm string `xml:"SSEAlgorithm"` // Bucket SSEAlgorithm
  212. }
  213. // ListObjectsResult defines the result from ListObjects request
  214. type ListObjectsResult struct {
  215. XMLName xml.Name `xml:"ListBucketResult"`
  216. Prefix string `xml:"Prefix"` // The object prefix
  217. Marker string `xml:"Marker"` // The marker filter.
  218. MaxKeys int `xml:"MaxKeys"` // Max keys to return
  219. Delimiter string `xml:"Delimiter"` // The delimiter for grouping objects' name
  220. IsTruncated bool `xml:"IsTruncated"` // Flag indicates if all results are returned (when it's false)
  221. NextMarker string `xml:"NextMarker"` // The start point of the next query
  222. Objects []ObjectProperties `xml:"Contents"` // Object list
  223. CommonPrefixes []string `xml:"CommonPrefixes>Prefix"` // You can think of commonprefixes as "folders" whose names end with the delimiter
  224. }
  225. // ObjectProperties defines Objecct properties
  226. type ObjectProperties struct {
  227. XMLName xml.Name `xml:"Contents"`
  228. Key string `xml:"Key"` // Object key
  229. Type string `xml:"Type"` // Object type
  230. Size int64 `xml:"Size"` // Object size
  231. ETag string `xml:"ETag"` // Object ETag
  232. Owner Owner `xml:"Owner"` // Object owner information
  233. LastModified time.Time `xml:"LastModified"` // Object last modified time
  234. StorageClass string `xml:"StorageClass"` // Object storage class (Standard, IA, Archive)
  235. }
  236. // ListObjectVersionsResult defines the result from ListObjectVersions request
  237. type ListObjectVersionsResult struct {
  238. XMLName xml.Name `xml:"ListVersionsResult"`
  239. Name string `xml:"Name"` // The Bucket Name
  240. Owner Owner `xml:"Owner"` // The owner of bucket
  241. Prefix string `xml:"Prefix"` // The object prefix
  242. KeyMarker string `xml:"KeyMarker"` // The start marker filter.
  243. VersionIdMarker string `xml:"VersionIdMarker"` // The start VersionIdMarker filter.
  244. MaxKeys int `xml:"MaxKeys"` // Max keys to return
  245. Delimiter string `xml:"Delimiter"` // The delimiter for grouping objects' name
  246. IsTruncated bool `xml:"IsTruncated"` // Flag indicates if all results are returned (when it's false)
  247. NextKeyMarker string `xml:"NextKeyMarker"` // The start point of the next query
  248. NextVersionIdMarker string `xml:"NextVersionIdMarker"` // The start point of the next query
  249. CommonPrefixes []string `xml:"CommonPrefixes>Prefix"` // You can think of commonprefixes as "folders" whose names end with the delimiter
  250. ObjectDeleteMarkers []ObjectDeleteMarkerProperties `xml:"DeleteMarker"` // DeleteMarker list
  251. ObjectVersions []ObjectVersionProperties `xml:"Version"` // version list
  252. }
  253. type ObjectDeleteMarkerProperties struct {
  254. XMLName xml.Name `xml:"DeleteMarker"`
  255. Key string `xml:"Key"` // The Object Key
  256. VersionId string `xml:"VersionId"` // The Object VersionId
  257. IsLatest bool `xml:"IsLatest"` // is current version or not
  258. LastModified time.Time `xml:"LastModified"` // Object last modified time
  259. Owner Owner `xml:"Owner"` // bucket owner element
  260. }
  261. type ObjectVersionProperties struct {
  262. XMLName xml.Name `xml:"Version"`
  263. Key string `xml:"Key"` // The Object Key
  264. VersionId string `xml:"VersionId"` // The Object VersionId
  265. IsLatest bool `xml:"IsLatest"` // is latest version or not
  266. LastModified time.Time `xml:"LastModified"` // Object last modified time
  267. Type string `xml:"Type"` // Object type
  268. Size int64 `xml:"Size"` // Object size
  269. ETag string `xml:"ETag"` // Object ETag
  270. StorageClass string `xml:"StorageClass"` // Object storage class (Standard, IA, Archive)
  271. Owner Owner `xml:"Owner"` // bucket owner element
  272. }
  273. // Owner defines Bucket/Object's owner
  274. type Owner struct {
  275. XMLName xml.Name `xml:"Owner"`
  276. ID string `xml:"ID"` // Owner ID
  277. DisplayName string `xml:"DisplayName"` // Owner's display name
  278. }
  279. // CopyObjectResult defines result object of CopyObject
  280. type CopyObjectResult struct {
  281. XMLName xml.Name `xml:"CopyObjectResult"`
  282. LastModified time.Time `xml:"LastModified"` // New object's last modified time.
  283. ETag string `xml:"ETag"` // New object's ETag
  284. }
  285. // GetObjectACLResult defines result of GetObjectACL request
  286. type GetObjectACLResult GetBucketACLResult
  287. type deleteXML struct {
  288. XMLName xml.Name `xml:"Delete"`
  289. Objects []DeleteObject `xml:"Object"` // Objects to delete
  290. Quiet bool `xml:"Quiet"` // Flag of quiet mode.
  291. }
  292. // DeleteObject defines the struct for deleting object
  293. type DeleteObject struct {
  294. XMLName xml.Name `xml:"Object"`
  295. Key string `xml:"Key"` // Object name
  296. VersionId string `xml:"VersionId,omitempty"` // Object VersionId
  297. }
  298. // DeleteObjectsResult defines result of DeleteObjects request
  299. type DeleteObjectsResult struct {
  300. XMLName xml.Name
  301. DeletedObjects []string // Deleted object key list
  302. }
  303. // DeleteObjectsResult_inner defines result of DeleteObjects request
  304. type DeleteObjectVersionsResult struct {
  305. XMLName xml.Name `xml:"DeleteResult"`
  306. DeletedObjectsDetail []DeletedKeyInfo `xml:"Deleted"` // Deleted object detail info
  307. }
  308. // DeleteKeyInfo defines object delete info
  309. type DeletedKeyInfo struct {
  310. XMLName xml.Name `xml:"Deleted"`
  311. Key string `xml:"Key"` // Object key
  312. VersionId string `xml:"VersionId"` // VersionId
  313. DeleteMarker bool `xml:"DeleteMarker"` // Object DeleteMarker
  314. DeleteMarkerVersionId string `xml:"DeleteMarkerVersionId"` // Object DeleteMarkerVersionId
  315. }
  316. // InitiateMultipartUploadResult defines result of InitiateMultipartUpload request
  317. type InitiateMultipartUploadResult struct {
  318. XMLName xml.Name `xml:"InitiateMultipartUploadResult"`
  319. Bucket string `xml:"Bucket"` // Bucket name
  320. Key string `xml:"Key"` // Object name to upload
  321. UploadID string `xml:"UploadId"` // Generated UploadId
  322. }
  323. // UploadPart defines the upload/copy part
  324. type UploadPart struct {
  325. XMLName xml.Name `xml:"Part"`
  326. PartNumber int `xml:"PartNumber"` // Part number
  327. ETag string `xml:"ETag"` // ETag value of the part's data
  328. }
  329. type uploadParts []UploadPart
  330. func (slice uploadParts) Len() int {
  331. return len(slice)
  332. }
  333. func (slice uploadParts) Less(i, j int) bool {
  334. return slice[i].PartNumber < slice[j].PartNumber
  335. }
  336. func (slice uploadParts) Swap(i, j int) {
  337. slice[i], slice[j] = slice[j], slice[i]
  338. }
  339. // UploadPartCopyResult defines result object of multipart copy request.
  340. type UploadPartCopyResult struct {
  341. XMLName xml.Name `xml:"CopyPartResult"`
  342. LastModified time.Time `xml:"LastModified"` // Last modified time
  343. ETag string `xml:"ETag"` // ETag
  344. }
  345. type completeMultipartUploadXML struct {
  346. XMLName xml.Name `xml:"CompleteMultipartUpload"`
  347. Part []UploadPart `xml:"Part"`
  348. }
  349. // CompleteMultipartUploadResult defines result object of CompleteMultipartUploadRequest
  350. type CompleteMultipartUploadResult struct {
  351. XMLName xml.Name `xml:"CompleteMultipartUploadResult"`
  352. Location string `xml:"Location"` // Object URL
  353. Bucket string `xml:"Bucket"` // Bucket name
  354. ETag string `xml:"ETag"` // Object ETag
  355. Key string `xml:"Key"` // Object name
  356. }
  357. // ListUploadedPartsResult defines result object of ListUploadedParts
  358. type ListUploadedPartsResult struct {
  359. XMLName xml.Name `xml:"ListPartsResult"`
  360. Bucket string `xml:"Bucket"` // Bucket name
  361. Key string `xml:"Key"` // Object name
  362. UploadID string `xml:"UploadId"` // Upload ID
  363. NextPartNumberMarker string `xml:"NextPartNumberMarker"` // Next part number
  364. MaxParts int `xml:"MaxParts"` // Max parts count
  365. IsTruncated bool `xml:"IsTruncated"` // Flag indicates all entries returned.false: all entries returned.
  366. UploadedParts []UploadedPart `xml:"Part"` // Uploaded parts
  367. }
  368. // UploadedPart defines uploaded part
  369. type UploadedPart struct {
  370. XMLName xml.Name `xml:"Part"`
  371. PartNumber int `xml:"PartNumber"` // Part number
  372. LastModified time.Time `xml:"LastModified"` // Last modified time
  373. ETag string `xml:"ETag"` // ETag cache
  374. Size int `xml:"Size"` // Part size
  375. }
  376. // ListMultipartUploadResult defines result object of ListMultipartUpload
  377. type ListMultipartUploadResult struct {
  378. XMLName xml.Name `xml:"ListMultipartUploadsResult"`
  379. Bucket string `xml:"Bucket"` // Bucket name
  380. Delimiter string `xml:"Delimiter"` // Delimiter for grouping object.
  381. Prefix string `xml:"Prefix"` // Object prefix
  382. KeyMarker string `xml:"KeyMarker"` // Object key marker
  383. UploadIDMarker string `xml:"UploadIdMarker"` // UploadId marker
  384. NextKeyMarker string `xml:"NextKeyMarker"` // Next key marker, if not all entries returned.
  385. NextUploadIDMarker string `xml:"NextUploadIdMarker"` // Next uploadId marker, if not all entries returned.
  386. MaxUploads int `xml:"MaxUploads"` // Max uploads to return
  387. IsTruncated bool `xml:"IsTruncated"` // Flag indicates all entries are returned.
  388. Uploads []UncompletedUpload `xml:"Upload"` // Ongoing uploads (not completed, not aborted)
  389. CommonPrefixes []string `xml:"CommonPrefixes>Prefix"` // Common prefixes list.
  390. }
  391. // UncompletedUpload structure wraps an uncompleted upload task
  392. type UncompletedUpload struct {
  393. XMLName xml.Name `xml:"Upload"`
  394. Key string `xml:"Key"` // Object name
  395. UploadID string `xml:"UploadId"` // The UploadId
  396. Initiated time.Time `xml:"Initiated"` // Initialization time in the format such as 2012-02-23T04:18:23.000Z
  397. }
  398. // ProcessObjectResult defines result object of ProcessObject
  399. type ProcessObjectResult struct {
  400. Bucket string `json:"bucket"`
  401. FileSize int `json:"fileSize"`
  402. Object string `json:"object"`
  403. Status string `json:"status"`
  404. }
  405. // decodeDeleteObjectsResult decodes deleting objects result in URL encoding
  406. func decodeDeleteObjectsResult(result *DeleteObjectVersionsResult) error {
  407. var err error
  408. for i := 0; i < len(result.DeletedObjectsDetail); i++ {
  409. result.DeletedObjectsDetail[i].Key, err = url.QueryUnescape(result.DeletedObjectsDetail[i].Key)
  410. if err != nil {
  411. return err
  412. }
  413. }
  414. return nil
  415. }
  416. // decodeListObjectsResult decodes list objects result in URL encoding
  417. func decodeListObjectsResult(result *ListObjectsResult) error {
  418. var err error
  419. result.Prefix, err = url.QueryUnescape(result.Prefix)
  420. if err != nil {
  421. return err
  422. }
  423. result.Marker, err = url.QueryUnescape(result.Marker)
  424. if err != nil {
  425. return err
  426. }
  427. result.Delimiter, err = url.QueryUnescape(result.Delimiter)
  428. if err != nil {
  429. return err
  430. }
  431. result.NextMarker, err = url.QueryUnescape(result.NextMarker)
  432. if err != nil {
  433. return err
  434. }
  435. for i := 0; i < len(result.Objects); i++ {
  436. result.Objects[i].Key, err = url.QueryUnescape(result.Objects[i].Key)
  437. if err != nil {
  438. return err
  439. }
  440. }
  441. for i := 0; i < len(result.CommonPrefixes); i++ {
  442. result.CommonPrefixes[i], err = url.QueryUnescape(result.CommonPrefixes[i])
  443. if err != nil {
  444. return err
  445. }
  446. }
  447. return nil
  448. }
  449. // decodeListObjectVersionsResult decodes list version objects result in URL encoding
  450. func decodeListObjectVersionsResult(result *ListObjectVersionsResult) error {
  451. var err error
  452. // decode:Delimiter
  453. result.Delimiter, err = url.QueryUnescape(result.Delimiter)
  454. if err != nil {
  455. return err
  456. }
  457. // decode Prefix
  458. result.Prefix, err = url.QueryUnescape(result.Prefix)
  459. if err != nil {
  460. return err
  461. }
  462. // decode KeyMarker
  463. result.KeyMarker, err = url.QueryUnescape(result.KeyMarker)
  464. if err != nil {
  465. return err
  466. }
  467. // decode VersionIdMarker
  468. result.VersionIdMarker, err = url.QueryUnescape(result.VersionIdMarker)
  469. if err != nil {
  470. return err
  471. }
  472. // decode NextKeyMarker
  473. result.NextKeyMarker, err = url.QueryUnescape(result.NextKeyMarker)
  474. if err != nil {
  475. return err
  476. }
  477. // decode NextVersionIdMarker
  478. result.NextVersionIdMarker, err = url.QueryUnescape(result.NextVersionIdMarker)
  479. if err != nil {
  480. return err
  481. }
  482. // decode CommonPrefixes
  483. for i := 0; i < len(result.CommonPrefixes); i++ {
  484. result.CommonPrefixes[i], err = url.QueryUnescape(result.CommonPrefixes[i])
  485. if err != nil {
  486. return err
  487. }
  488. }
  489. // decode deleteMarker
  490. for i := 0; i < len(result.ObjectDeleteMarkers); i++ {
  491. result.ObjectDeleteMarkers[i].Key, err = url.QueryUnescape(result.ObjectDeleteMarkers[i].Key)
  492. if err != nil {
  493. return err
  494. }
  495. }
  496. // decode ObjectVersions
  497. for i := 0; i < len(result.ObjectVersions); i++ {
  498. result.ObjectVersions[i].Key, err = url.QueryUnescape(result.ObjectVersions[i].Key)
  499. if err != nil {
  500. return err
  501. }
  502. }
  503. return nil
  504. }
  505. // decodeListUploadedPartsResult decodes
  506. func decodeListUploadedPartsResult(result *ListUploadedPartsResult) error {
  507. var err error
  508. result.Key, err = url.QueryUnescape(result.Key)
  509. if err != nil {
  510. return err
  511. }
  512. return nil
  513. }
  514. // decodeListMultipartUploadResult decodes list multipart upload result in URL encoding
  515. func decodeListMultipartUploadResult(result *ListMultipartUploadResult) error {
  516. var err error
  517. result.Prefix, err = url.QueryUnescape(result.Prefix)
  518. if err != nil {
  519. return err
  520. }
  521. result.Delimiter, err = url.QueryUnescape(result.Delimiter)
  522. if err != nil {
  523. return err
  524. }
  525. result.KeyMarker, err = url.QueryUnescape(result.KeyMarker)
  526. if err != nil {
  527. return err
  528. }
  529. result.NextKeyMarker, err = url.QueryUnescape(result.NextKeyMarker)
  530. if err != nil {
  531. return err
  532. }
  533. for i := 0; i < len(result.Uploads); i++ {
  534. result.Uploads[i].Key, err = url.QueryUnescape(result.Uploads[i].Key)
  535. if err != nil {
  536. return err
  537. }
  538. }
  539. for i := 0; i < len(result.CommonPrefixes); i++ {
  540. result.CommonPrefixes[i], err = url.QueryUnescape(result.CommonPrefixes[i])
  541. if err != nil {
  542. return err
  543. }
  544. }
  545. return nil
  546. }
  547. // createBucketConfiguration defines the configuration for creating a bucket.
  548. type createBucketConfiguration struct {
  549. XMLName xml.Name `xml:"CreateBucketConfiguration"`
  550. StorageClass StorageClassType `xml:"StorageClass,omitempty"`
  551. }
  552. // LiveChannelConfiguration defines the configuration for live-channel
  553. type LiveChannelConfiguration struct {
  554. XMLName xml.Name `xml:"LiveChannelConfiguration"`
  555. Description string `xml:"Description,omitempty"` //Description of live-channel, up to 128 bytes
  556. Status string `xml:"Status,omitempty"` //Specify the status of livechannel
  557. Target LiveChannelTarget `xml:"Target"` //target configuration of live-channel
  558. // use point instead of struct to avoid omit empty snapshot
  559. Snapshot *LiveChannelSnapshot `xml:"Snapshot,omitempty"` //snapshot configuration of live-channel
  560. }
  561. // LiveChannelTarget target configuration of live-channel
  562. type LiveChannelTarget struct {
  563. XMLName xml.Name `xml:"Target"`
  564. Type string `xml:"Type"` //the type of object, only supports HLS
  565. FragDuration int `xml:"FragDuration,omitempty"` //the length of each ts object (in seconds), in the range [1,100]
  566. FragCount int `xml:"FragCount,omitempty"` //the number of ts objects in the m3u8 object, in the range of [1,100]
  567. PlaylistName string `xml:"PlaylistName,omitempty"` //the name of m3u8 object, which must end with ".m3u8" and the length range is [6,128]
  568. }
  569. // LiveChannelSnapshot snapshot configuration of live-channel
  570. type LiveChannelSnapshot struct {
  571. XMLName xml.Name `xml:"Snapshot"`
  572. RoleName string `xml:"RoleName,omitempty"` //The role of snapshot operations, it sholud has write permission of DestBucket and the permission to send messages to the NotifyTopic.
  573. DestBucket string `xml:"DestBucket,omitempty"` //Bucket the snapshots will be written to. should be the same owner as the source bucket.
  574. NotifyTopic string `xml:"NotifyTopic,omitempty"` //Topics of MNS for notifying users of high frequency screenshot operation results
  575. Interval int `xml:"Interval,omitempty"` //interval of snapshots, threre is no snapshot if no I-frame during the interval time
  576. }
  577. // CreateLiveChannelResult the result of crete live-channel
  578. type CreateLiveChannelResult struct {
  579. XMLName xml.Name `xml:"CreateLiveChannelResult"`
  580. PublishUrls []string `xml:"PublishUrls>Url"` //push urls list
  581. PlayUrls []string `xml:"PlayUrls>Url"` //play urls list
  582. }
  583. // LiveChannelStat the result of get live-channel state
  584. type LiveChannelStat struct {
  585. XMLName xml.Name `xml:"LiveChannelStat"`
  586. Status string `xml:"Status"` //Current push status of live-channel: Disabled,Live,Idle
  587. ConnectedTime time.Time `xml:"ConnectedTime"` //The time when the client starts pushing, format: ISO8601
  588. RemoteAddr string `xml:"RemoteAddr"` //The ip address of the client
  589. Video LiveChannelVideo `xml:"Video"` //Video stream information
  590. Audio LiveChannelAudio `xml:"Audio"` //Audio stream information
  591. }
  592. // LiveChannelVideo video stream information
  593. type LiveChannelVideo struct {
  594. XMLName xml.Name `xml:"Video"`
  595. Width int `xml:"Width"` //Width (unit: pixels)
  596. Height int `xml:"Height"` //Height (unit: pixels)
  597. FrameRate int `xml:"FrameRate"` //FramRate
  598. Bandwidth int `xml:"Bandwidth"` //Bandwidth (unit: B/s)
  599. }
  600. // LiveChannelAudio audio stream information
  601. type LiveChannelAudio struct {
  602. XMLName xml.Name `xml:"Audio"`
  603. SampleRate int `xml:"SampleRate"` //SampleRate
  604. Bandwidth int `xml:"Bandwidth"` //Bandwidth (unit: B/s)
  605. Codec string `xml:"Codec"` //Encoding forma
  606. }
  607. // LiveChannelHistory the result of GetLiveChannelHistory, at most return up to lastest 10 push records
  608. type LiveChannelHistory struct {
  609. XMLName xml.Name `xml:"LiveChannelHistory"`
  610. Record []LiveRecord `xml:"LiveRecord"` //push records list
  611. }
  612. // LiveRecord push recode
  613. type LiveRecord struct {
  614. XMLName xml.Name `xml:"LiveRecord"`
  615. StartTime time.Time `xml:"StartTime"` //StartTime, format: ISO8601
  616. EndTime time.Time `xml:"EndTime"` //EndTime, format: ISO8601
  617. RemoteAddr string `xml:"RemoteAddr"` //The ip address of remote client
  618. }
  619. // ListLiveChannelResult the result of ListLiveChannel
  620. type ListLiveChannelResult struct {
  621. XMLName xml.Name `xml:"ListLiveChannelResult"`
  622. Prefix string `xml:"Prefix"` //Filter by the name start with the value of "Prefix"
  623. Marker string `xml:"Marker"` //cursor from which starting list
  624. MaxKeys int `xml:"MaxKeys"` //The maximum count returned. the default value is 100. it cannot be greater than 1000.
  625. IsTruncated bool `xml:"IsTruncated"` //Indicates whether all results have been returned, "true" indicates partial results returned while "false" indicates all results have been returned
  626. NextMarker string `xml:"NextMarker"` //NextMarker indicate the Marker value of the next request
  627. LiveChannel []LiveChannelInfo `xml:"LiveChannel"` //The infomation of live-channel
  628. }
  629. // LiveChannelInfo the infomation of live-channel
  630. type LiveChannelInfo struct {
  631. XMLName xml.Name `xml:"LiveChannel"`
  632. Name string `xml:"Name"` //The name of live-channel
  633. Description string `xml:"Description"` //Description of live-channel
  634. Status string `xml:"Status"` //Status: disabled or enabled
  635. LastModified time.Time `xml:"LastModified"` //Last modification time, format: ISO8601
  636. PublishUrls []string `xml:"PublishUrls>Url"` //push urls list
  637. PlayUrls []string `xml:"PlayUrls>Url"` //play urls list
  638. }
  639. // Tag a tag for the object
  640. type Tag struct {
  641. XMLName xml.Name `xml:"Tag"`
  642. Key string `xml:"Key"`
  643. Value string `xml:"Value"`
  644. }
  645. // Tagging tagset for the object
  646. type Tagging struct {
  647. XMLName xml.Name `xml:"Tagging"`
  648. Tags []Tag `xml:"TagSet>Tag,omitempty"`
  649. }
  650. // for GetObjectTagging return value
  651. type GetObjectTaggingResult Tagging
  652. // VersioningConfig for the bucket
  653. type VersioningConfig struct {
  654. XMLName xml.Name `xml:"VersioningConfiguration"`
  655. Status string `xml:"Status"`
  656. }
  657. type GetBucketVersioningResult VersioningConfig
  658. // Server Encryption rule for the bucket
  659. type ServerEncryptionRule struct {
  660. XMLName xml.Name `xml:"ServerSideEncryptionRule"`
  661. SSEDefault SSEDefaultRule `xml:"ApplyServerSideEncryptionByDefault"`
  662. }
  663. // Server Encryption deafult rule for the bucket
  664. type SSEDefaultRule struct {
  665. XMLName xml.Name `xml:"ApplyServerSideEncryptionByDefault"`
  666. SSEAlgorithm string `xml:"SSEAlgorithm"`
  667. KMSMasterKeyID string `xml:"KMSMasterKeyID"`
  668. }
  669. type GetBucketEncryptionResult ServerEncryptionRule
  670. type GetBucketTaggingResult Tagging
  671. type BucketStat struct {
  672. XMLName xml.Name `xml:"BucketStat"`
  673. Storage int64 `xml:"Storage"`
  674. ObjectCount int64 `xml:ObjectCount`
  675. MultipartUploadCount int64 `xml:MultipartUploadCount`
  676. }
  677. type GetBucketStatResult BucketStat