type.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424
  1. package oss
  2. import (
  3. "encoding/xml"
  4. "net/url"
  5. "time"
  6. )
  7. // ListBucketsResult ListBuckets请求返回的结果
  8. type ListBucketsResult struct {
  9. XMLName xml.Name `xml:"ListAllMyBucketsResult"`
  10. Prefix string `xml:"Prefix"` // 本次查询结果的前缀
  11. Marker string `xml:"Marker"` // 标明查询的起点,未全部返回时有此节点
  12. MaxKeys int `xml:"MaxKeys"` // 返回结果的最大数目,未全部返回时有此节点
  13. IsTruncated bool `xml:"IsTruncated"` // 所有的结果是否已经全部返回
  14. NextMarker string `xml:"NextMarker"` // 表示下一次查询的起点
  15. Owner Owner `xml:"Owner"` // 拥有者信息
  16. Buckets []BucketProperties `xml:"Buckets>Bucket"` // Bucket列表
  17. }
  18. // BucketProperties Bucket信息
  19. type BucketProperties struct {
  20. XMLName xml.Name `xml:"Bucket"`
  21. Name string `xml:"Name"` // Bucket名称
  22. Location string `xml:"Location"` // Bucket所在的数据中心
  23. CreationDate time.Time `xml:"CreationDate"` // Bucket创建时间
  24. }
  25. // GetBucketACLResult GetBucketACL请求返回的结果
  26. type GetBucketACLResult struct {
  27. XMLName xml.Name `xml:"AccessControlPolicy"`
  28. ACL string `xml:"AccessControlList>Grant"` // Bucket权限
  29. Owner Owner `xml:"Owner"` // Bucket拥有者信息
  30. }
  31. // LifecycleConfiguration Bucket的Lifecycle配置
  32. type LifecycleConfiguration struct {
  33. XMLName xml.Name `xml:"LifecycleConfiguration"`
  34. Rules []LifecycleRule `xml:"Rule"`
  35. }
  36. // LifecycleRule Lifecycle规则
  37. type LifecycleRule struct {
  38. XMLName xml.Name `xml:"Rule"`
  39. ID string `xml:"ID"` // 规则唯一的ID
  40. Prefix string `xml:"Prefix"` // 规则所适用Object的前缀
  41. Status string `xml:"Status"` // 规则是否生效
  42. Expiration LifecycleExpiration `xml:"Expiration"` // 规则的过期属性
  43. }
  44. // LifecycleExpiration 规则的过期属性
  45. type LifecycleExpiration struct {
  46. XMLName xml.Name `xml:"Expiration"`
  47. Days int `xml:"Days,omitempty"` // 最后修改时间过后多少天生效
  48. Date time.Time `xml:"Date,omitempty"` // 指定规则何时生效
  49. }
  50. type lifecycleXML struct {
  51. XMLName xml.Name `xml:"LifecycleConfiguration"`
  52. Rules []lifecycleRule `xml:"Rule"`
  53. }
  54. type lifecycleRule struct {
  55. XMLName xml.Name `xml:"Rule"`
  56. ID string `xml:"ID"`
  57. Prefix string `xml:"Prefix"`
  58. Status string `xml:"Status"`
  59. Expiration lifecycleExpiration `xml:"Expiration"`
  60. }
  61. type lifecycleExpiration struct {
  62. XMLName xml.Name `xml:"Expiration"`
  63. Days int `xml:"Days,omitempty"`
  64. Date string `xml:"Date,omitempty"`
  65. }
  66. const expirationDateFormat = "2006-01-02T15:04:05.000Z"
  67. func convLifecycleRule(rules []LifecycleRule) []lifecycleRule {
  68. rs := []lifecycleRule{}
  69. for _, rule := range rules {
  70. r := lifecycleRule{}
  71. r.ID = rule.ID
  72. r.Prefix = rule.Prefix
  73. r.Status = rule.Status
  74. if rule.Expiration.Date.IsZero() {
  75. r.Expiration.Days = rule.Expiration.Days
  76. } else {
  77. r.Expiration.Date = rule.Expiration.Date.Format(expirationDateFormat)
  78. }
  79. rs = append(rs, r)
  80. }
  81. return rs
  82. }
  83. // BuildLifecycleRuleByDays 指定过期天数构建Lifecycle规则
  84. func BuildLifecycleRuleByDays(id, prefix string, status bool, days int) LifecycleRule {
  85. var statusStr = "Enabled"
  86. if !status {
  87. statusStr = "Disabled"
  88. }
  89. return LifecycleRule{ID: id, Prefix: prefix, Status: statusStr,
  90. Expiration: LifecycleExpiration{Days: days}}
  91. }
  92. // BuildLifecycleRuleByDate 指定过期时间构建Lifecycle规则
  93. func BuildLifecycleRuleByDate(id, prefix string, status bool, year, month, day int) LifecycleRule {
  94. var statusStr = "Enabled"
  95. if !status {
  96. statusStr = "Disabled"
  97. }
  98. date := time.Date(year, time.Month(month), day, 0, 0, 0, 0, time.UTC)
  99. return LifecycleRule{ID: id, Prefix: prefix, Status: statusStr,
  100. Expiration: LifecycleExpiration{Date: date}}
  101. }
  102. // GetBucketLifecycleResult GetBucketLifecycle请求请求结果
  103. type GetBucketLifecycleResult LifecycleConfiguration
  104. // RefererXML Referer配置
  105. type RefererXML struct {
  106. XMLName xml.Name `xml:"RefererConfiguration"`
  107. AllowEmptyReferer bool `xml:"AllowEmptyReferer"` // 是否允许referer字段为空的请求访问
  108. RefererList []string `xml:"RefererList>Referer"` // referer访问白名单
  109. }
  110. // GetBucketRefererResult GetBucketReferer请教返回结果
  111. type GetBucketRefererResult RefererXML
  112. // LoggingXML Logging配置
  113. type LoggingXML struct {
  114. XMLName xml.Name `xml:"BucketLoggingStatus"`
  115. LoggingEnabled LoggingEnabled `xml:"LoggingEnabled"` // 访问日志信息容器
  116. }
  117. type loggingXMLEmpty struct {
  118. XMLName xml.Name `xml:"BucketLoggingStatus"`
  119. }
  120. // LoggingEnabled 访问日志信息容器
  121. type LoggingEnabled struct {
  122. XMLName xml.Name `xml:"LoggingEnabled"`
  123. TargetBucket string `xml:"TargetBucket"` //存放访问日志的Bucket
  124. TargetPrefix string `xml:"TargetPrefix"` //保存访问日志的文件前缀
  125. }
  126. // GetBucketLoggingResult GetBucketLogging请求返回结果
  127. type GetBucketLoggingResult LoggingXML
  128. // WebsiteXML Website配置
  129. type WebsiteXML struct {
  130. XMLName xml.Name `xml:"WebsiteConfiguration"`
  131. IndexDocument IndexDocument `xml:"IndexDocument"` // 目录URL时添加的索引文件
  132. ErrorDocument ErrorDocument `xml:"ErrorDocument"` // 404错误时使用的文件
  133. }
  134. // IndexDocument 目录URL时添加的索引文件
  135. type IndexDocument struct {
  136. XMLName xml.Name `xml:"IndexDocument"`
  137. Suffix string `xml:"Suffix"` // 目录URL时添加的索引文件名
  138. }
  139. // ErrorDocument 404错误时使用的文件
  140. type ErrorDocument struct {
  141. XMLName xml.Name `xml:"ErrorDocument"`
  142. Key string `xml:"Key"` // 404错误时使用的文件名
  143. }
  144. // GetBucketWebsiteResult GetBucketWebsite请求返回结果
  145. type GetBucketWebsiteResult WebsiteXML
  146. // CORSXML CORS配置
  147. type CORSXML struct {
  148. XMLName xml.Name `xml:"CORSConfiguration"`
  149. CORSRules []CORSRule `xml:"CORSRule"` // CORS规则列表
  150. }
  151. // CORSRule CORS规则
  152. type CORSRule struct {
  153. XMLName xml.Name `xml:"CORSRule"`
  154. AllowedOrigin []string `xml:"AllowedOrigin"` // 允许的来源,默认通配符"*"
  155. AllowedMethod []string `xml:"AllowedMethod"` // 允许的方法
  156. AllowedHeader []string `xml:"AllowedHeader"` // 允许的请求头
  157. ExposeHeader []string `xml:"ExposeHeader"` // 允许的响应头
  158. MaxAgeSeconds int `xml:"MaxAgeSeconds"` // 最大的缓存时间
  159. }
  160. // GetBucketCORSResult GetBucketCORS请求返回的结果
  161. type GetBucketCORSResult CORSXML
  162. // ListObjectsResult ListObjects请求返回结果
  163. type ListObjectsResult struct {
  164. XMLName xml.Name `xml:"ListBucketResult"`
  165. Prefix string `xml:"Prefix"` // 本次查询结果的开始前缀
  166. Marker string `xml:"Marker"` // 这次查询的起点
  167. MaxKeys int `xml:"MaxKeys"` // 请求返回结果的最大数目
  168. Delimiter string `xml:"Delimiter"` // 对Object名字进行分组的字符
  169. IsTruncated bool `xml:"IsTruncated"` // 是否所有的结果都已经返回
  170. NextMarker string `xml:"NextMarker"` // 下一次查询的起点
  171. Objects []ObjectProperties `xml:"Contents"` // Object类别
  172. CommonPrefixes []string `xml:"CommonPrefixes>Prefix"` // 以delimiter结尾并有共同前缀的Object的集合
  173. }
  174. // ObjectProperties Objecct属性
  175. type ObjectProperties struct {
  176. XMLName xml.Name `xml:"Contents"`
  177. Key string `xml:"Key"` // Object的Key
  178. Type string `xml:"Type"` // Object Type
  179. Size uint `xml:"Size"` // Object的长度字节数
  180. ETag string `xml:"ETag"` // 标示Object的内容
  181. Owner Owner `xml:"Owner"` // 保存Object拥有者信息的容器
  182. LastModified time.Time `xml:"LastModified"` // Object最后修改时间
  183. StorageClass string `xml:"StorageClass"` // Object的存储类型,目前只能是Standard
  184. }
  185. // Owner Bucket/Object的owner
  186. type Owner struct {
  187. XMLName xml.Name `xml:"Owner"`
  188. ID string `xml:"ID"` // 用户ID
  189. DisplayName string `xml:"DisplayName"` // Owner名字
  190. }
  191. // CopyObjectResult CopyObject请求返回的结果
  192. type CopyObjectResult struct {
  193. XMLName xml.Name `xml:"CopyObjectResult"`
  194. LastModified time.Time `xml:"LastModified"` // 新Object最后更新时间
  195. ETag string `xml:"ETag"` // 新Object的ETag值
  196. }
  197. // GetObjectACLResult GetObjectACL请求返回的结果
  198. type GetObjectACLResult GetBucketACLResult
  199. type deleteXML struct {
  200. XMLName xml.Name `xml:"Delete"`
  201. Objects []DeleteObject `xml:"Object"` // 删除的所有Object
  202. Quiet bool `xml:"Quiet"` // 安静响应模式
  203. }
  204. // DeleteObject 删除的Object
  205. type DeleteObject struct {
  206. XMLName xml.Name `xml:"Object"`
  207. Key string `xml:"Key"` // Object名称
  208. }
  209. // DeleteObjectsResult DeleteObjects请求返回结果
  210. type DeleteObjectsResult struct {
  211. XMLName xml.Name `xml:"DeleteResult"`
  212. DeletedObjects []string `xml:"Deleted>Key"` // 删除的Object列表
  213. }
  214. // InitiateMultipartUploadResult InitiateMultipartUpload请求返回结果
  215. type InitiateMultipartUploadResult struct {
  216. XMLName xml.Name `xml:"InitiateMultipartUploadResult"`
  217. Bucket string `xml:"Bucket"` // Bucket名称
  218. Key string `xml:"Key"` // 上传Object名称
  219. UploadID string `xml:"UploadId"` // 生成的UploadId
  220. }
  221. // UploadPart 上传/拷贝的分片
  222. type UploadPart struct {
  223. XMLName xml.Name `xml:"Part"`
  224. PartNumber int `xml:"PartNumber"` // Part编号
  225. ETag string `xml:"ETag"` // ETag缓存码
  226. }
  227. type uploadParts []UploadPart
  228. func (slice uploadParts) Len() int {
  229. return len(slice)
  230. }
  231. func (slice uploadParts) Less(i, j int) bool {
  232. return slice[i].PartNumber < slice[j].PartNumber
  233. }
  234. func (slice uploadParts) Swap(i, j int) {
  235. slice[i], slice[j] = slice[j], slice[i]
  236. }
  237. // UploadPartCopyResult 拷贝分片请求返回的结果
  238. type UploadPartCopyResult struct {
  239. XMLName xml.Name `xml:"CopyPartResult"`
  240. LastModified time.Time `xml:"LastModified"` // 最后修改时间
  241. ETag string `xml:"ETag"` // ETag
  242. }
  243. type completeMultipartUploadXML struct {
  244. XMLName xml.Name `xml:"CompleteMultipartUpload"`
  245. Part []UploadPart `xml:"Part"`
  246. }
  247. // CompleteMultipartUploadResult 提交分片上传任务返回结果
  248. type CompleteMultipartUploadResult struct {
  249. XMLName xml.Name `xml:"CompleteMultipartUploadResult"`
  250. Location string `xml:"Location"` // Object的URL
  251. Bucket string `xml:"Bucket"` // Bucket名称
  252. ETag string `xml:"ETag"` // Object的ETag
  253. Key string `xml:"Key"` // Object的名字
  254. }
  255. // ListUploadedPartsResult ListUploadedParts请求返回结果
  256. type ListUploadedPartsResult struct {
  257. XMLName xml.Name `xml:"ListPartsResult"`
  258. Bucket string `xml:"Bucket"` // Bucket名称
  259. Key string `xml:"Key"` // Object名称
  260. UploadID string `xml:"UploadId"` // 上传Id
  261. NextPartNumberMarker string `xml:"NextPartNumberMarker"` // 下一个Part的位置
  262. MaxParts int `xml:"MaxParts"` // 最大Part个数
  263. IsTruncated bool `xml:"IsTruncated"` // 是否完全上传完成
  264. UploadedParts []UploadedPart `xml:"Part"` // 已完成的Part
  265. }
  266. // UploadedPart 该任务已经上传的分片
  267. type UploadedPart struct {
  268. XMLName xml.Name `xml:"Part"`
  269. PartNumber int `xml:"PartNumber"` // Part编号
  270. LastModified time.Time `xml:"LastModified"` // 最后一次修改时间
  271. ETag string `xml:"ETag"` // ETag缓存码
  272. Size int `xml:"Size"` // Part大小
  273. }
  274. // ListMultipartUploadResult ListMultipartUpload请求返回结果
  275. type ListMultipartUploadResult struct {
  276. XMLName xml.Name `xml:"ListMultipartUploadsResult"`
  277. Bucket string `xml:"Bucket"` // Bucket名称
  278. Delimiter string `xml:"Delimiter"` // 分组分割符
  279. Prefix string `xml:"Prefix"` // 筛选前缀
  280. KeyMarker string `xml:"KeyMarker"` // 起始Object位置
  281. UploadIDMarker string `xml:"UploadIdMarker"` // 起始UploadId位置
  282. NextKeyMarker string `xml:"NextKeyMarker"` // 如果没有全部返回,标明接下去的KeyMarker位置
  283. NextUploadIDMarker string `xml:"NextUploadIdMarker"` // 如果没有全部返回,标明接下去的UploadId位置
  284. MaxUploads int `xml:"MaxUploads"` // 返回最大Upload数目
  285. IsTruncated bool `xml:"IsTruncated"` // 是否完全返回
  286. Uploads []UncompletedUpload `xml:"Upload"` // 未完成上传的MultipartUpload
  287. CommonPrefixes []string `xml:"CommonPrefixes>Prefix"` // 所有名字包含指定的前缀且第一次出现delimiter字符之间的object作为一组的分组结果
  288. }
  289. // UncompletedUpload 未完成的Upload任务
  290. type UncompletedUpload struct {
  291. XMLName xml.Name `xml:"Upload"`
  292. Key string `xml:"Key"` // Object名称
  293. UploadID string `xml:"UploadId"` // 对应UploadId
  294. Initiated time.Time `xml:"Initiated"` // 初始化时间,格式2012-02-23T04:18:23.000Z
  295. }
  296. // 解析URL编码
  297. func decodeDeleteObjectsResult(result *DeleteObjectsResult) error {
  298. var err error
  299. for i := 0; i < len(result.DeletedObjects); i++ {
  300. result.DeletedObjects[i], err = url.QueryUnescape(result.DeletedObjects[i])
  301. if err != nil {
  302. return err
  303. }
  304. }
  305. return nil
  306. }
  307. // 解析URL编码
  308. func decodeListObjectsResult(result *ListObjectsResult) error {
  309. var err error
  310. result.Prefix, err = url.QueryUnescape(result.Prefix)
  311. if err != nil {
  312. return err
  313. }
  314. result.Marker, err = url.QueryUnescape(result.Marker)
  315. if err != nil {
  316. return err
  317. }
  318. result.Delimiter, err = url.QueryUnescape(result.Delimiter)
  319. if err != nil {
  320. return err
  321. }
  322. result.NextMarker, err = url.QueryUnescape(result.NextMarker)
  323. if err != nil {
  324. return err
  325. }
  326. for i := 0; i < len(result.Objects); i++ {
  327. result.Objects[i].Key, err = url.QueryUnescape(result.Objects[i].Key)
  328. if err != nil {
  329. return err
  330. }
  331. }
  332. for i := 0; i < len(result.CommonPrefixes); i++ {
  333. result.CommonPrefixes[i], err = url.QueryUnescape(result.CommonPrefixes[i])
  334. if err != nil {
  335. return err
  336. }
  337. }
  338. return nil
  339. }
  340. // 解析URL编码
  341. func decodeListMultipartUploadResult(result *ListMultipartUploadResult) error {
  342. var err error
  343. result.Prefix, err = url.QueryUnescape(result.Prefix)
  344. if err != nil {
  345. return err
  346. }
  347. result.Delimiter, err = url.QueryUnescape(result.Delimiter)
  348. if err != nil {
  349. return err
  350. }
  351. result.KeyMarker, err = url.QueryUnescape(result.KeyMarker)
  352. if err != nil {
  353. return err
  354. }
  355. result.NextKeyMarker, err = url.QueryUnescape(result.NextKeyMarker)
  356. if err != nil {
  357. return err
  358. }
  359. for i := 0; i < len(result.Uploads); i++ {
  360. result.Uploads[i].Key, err = url.QueryUnescape(result.Uploads[i].Key)
  361. if err != nil {
  362. return err
  363. }
  364. }
  365. for i := 0; i < len(result.CommonPrefixes); i++ {
  366. result.CommonPrefixes[i], err = url.QueryUnescape(result.CommonPrefixes[i])
  367. if err != nil {
  368. return err
  369. }
  370. }
  371. return nil
  372. }