type.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  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. // GetBucketInfoResult GetBucketInfo请求返回结果
  163. type GetBucketInfoResult struct {
  164. XMLName xml.Name `xml:"BucketInfo"`
  165. BucketInfo BucketInfo `xml:"Bucket"`
  166. }
  167. // BucketInfo Bucket信息
  168. type BucketInfo struct {
  169. XMLName xml.Name `xml:"Bucket"`
  170. Name string `xml:"Name"` // Bucket名称
  171. Location string `xml:"Location"` // Bucket所在的数据中心
  172. CreationDate time.Time `xml:"CreationDate"` // Bucket创建时间
  173. ExtranetEndpoint string `xml:"ExtranetEndpoint"` // Bucket访问的外网域名
  174. IntranetEndpoint string `xml:"IntranetEndpoint"` // Bucket访问的内网域名
  175. ACL string `xml:"AccessControlList>Grant"` // Bucket权限
  176. Owner Owner `xml:"Owner"` // Bucket拥有者信息
  177. }
  178. // ListObjectsResult ListObjects请求返回结果
  179. type ListObjectsResult struct {
  180. XMLName xml.Name `xml:"ListBucketResult"`
  181. Prefix string `xml:"Prefix"` // 本次查询结果的开始前缀
  182. Marker string `xml:"Marker"` // 这次查询的起点
  183. MaxKeys int `xml:"MaxKeys"` // 请求返回结果的最大数目
  184. Delimiter string `xml:"Delimiter"` // 对Object名字进行分组的字符
  185. IsTruncated bool `xml:"IsTruncated"` // 是否所有的结果都已经返回
  186. NextMarker string `xml:"NextMarker"` // 下一次查询的起点
  187. Objects []ObjectProperties `xml:"Contents"` // Object类别
  188. CommonPrefixes []string `xml:"CommonPrefixes>Prefix"` // 以delimiter结尾并有共同前缀的Object的集合
  189. }
  190. // ObjectProperties Objecct属性
  191. type ObjectProperties struct {
  192. XMLName xml.Name `xml:"Contents"`
  193. Key string `xml:"Key"` // Object的Key
  194. Type string `xml:"Type"` // Object Type
  195. Size int64 `xml:"Size"` // Object的长度字节数
  196. ETag string `xml:"ETag"` // 标示Object的内容
  197. Owner Owner `xml:"Owner"` // 保存Object拥有者信息的容器
  198. LastModified time.Time `xml:"LastModified"` // Object最后修改时间
  199. StorageClass string `xml:"StorageClass"` // Object的存储类型,目前只能是Standard
  200. }
  201. // Owner Bucket/Object的owner
  202. type Owner struct {
  203. XMLName xml.Name `xml:"Owner"`
  204. ID string `xml:"ID"` // 用户ID
  205. DisplayName string `xml:"DisplayName"` // Owner名字
  206. }
  207. // CopyObjectResult CopyObject请求返回的结果
  208. type CopyObjectResult struct {
  209. XMLName xml.Name `xml:"CopyObjectResult"`
  210. LastModified time.Time `xml:"LastModified"` // 新Object最后更新时间
  211. ETag string `xml:"ETag"` // 新Object的ETag值
  212. }
  213. // GetObjectACLResult GetObjectACL请求返回的结果
  214. type GetObjectACLResult GetBucketACLResult
  215. type deleteXML struct {
  216. XMLName xml.Name `xml:"Delete"`
  217. Objects []DeleteObject `xml:"Object"` // 删除的所有Object
  218. Quiet bool `xml:"Quiet"` // 安静响应模式
  219. }
  220. // DeleteObject 删除的Object
  221. type DeleteObject struct {
  222. XMLName xml.Name `xml:"Object"`
  223. Key string `xml:"Key"` // Object名称
  224. }
  225. // DeleteObjectsResult DeleteObjects请求返回结果
  226. type DeleteObjectsResult struct {
  227. XMLName xml.Name `xml:"DeleteResult"`
  228. DeletedObjects []string `xml:"Deleted>Key"` // 删除的Object列表
  229. }
  230. // InitiateMultipartUploadResult InitiateMultipartUpload请求返回结果
  231. type InitiateMultipartUploadResult struct {
  232. XMLName xml.Name `xml:"InitiateMultipartUploadResult"`
  233. Bucket string `xml:"Bucket"` // Bucket名称
  234. Key string `xml:"Key"` // 上传Object名称
  235. UploadID string `xml:"UploadId"` // 生成的UploadId
  236. }
  237. // UploadPart 上传/拷贝的分片
  238. type UploadPart struct {
  239. XMLName xml.Name `xml:"Part"`
  240. PartNumber int `xml:"PartNumber"` // Part编号
  241. ETag string `xml:"ETag"` // ETag缓存码
  242. }
  243. type uploadParts []UploadPart
  244. func (slice uploadParts) Len() int {
  245. return len(slice)
  246. }
  247. func (slice uploadParts) Less(i, j int) bool {
  248. return slice[i].PartNumber < slice[j].PartNumber
  249. }
  250. func (slice uploadParts) Swap(i, j int) {
  251. slice[i], slice[j] = slice[j], slice[i]
  252. }
  253. // UploadPartCopyResult 拷贝分片请求返回的结果
  254. type UploadPartCopyResult struct {
  255. XMLName xml.Name `xml:"CopyPartResult"`
  256. LastModified time.Time `xml:"LastModified"` // 最后修改时间
  257. ETag string `xml:"ETag"` // ETag
  258. }
  259. type completeMultipartUploadXML struct {
  260. XMLName xml.Name `xml:"CompleteMultipartUpload"`
  261. Part []UploadPart `xml:"Part"`
  262. }
  263. // CompleteMultipartUploadResult 提交分片上传任务返回结果
  264. type CompleteMultipartUploadResult struct {
  265. XMLName xml.Name `xml:"CompleteMultipartUploadResult"`
  266. Location string `xml:"Location"` // Object的URL
  267. Bucket string `xml:"Bucket"` // Bucket名称
  268. ETag string `xml:"ETag"` // Object的ETag
  269. Key string `xml:"Key"` // Object的名字
  270. }
  271. // ListUploadedPartsResult ListUploadedParts请求返回结果
  272. type ListUploadedPartsResult struct {
  273. XMLName xml.Name `xml:"ListPartsResult"`
  274. Bucket string `xml:"Bucket"` // Bucket名称
  275. Key string `xml:"Key"` // Object名称
  276. UploadID string `xml:"UploadId"` // 上传Id
  277. NextPartNumberMarker string `xml:"NextPartNumberMarker"` // 下一个Part的位置
  278. MaxParts int `xml:"MaxParts"` // 最大Part个数
  279. IsTruncated bool `xml:"IsTruncated"` // 是否完全上传完成
  280. UploadedParts []UploadedPart `xml:"Part"` // 已完成的Part
  281. }
  282. // UploadedPart 该任务已经上传的分片
  283. type UploadedPart struct {
  284. XMLName xml.Name `xml:"Part"`
  285. PartNumber int `xml:"PartNumber"` // Part编号
  286. LastModified time.Time `xml:"LastModified"` // 最后一次修改时间
  287. ETag string `xml:"ETag"` // ETag缓存码
  288. Size int `xml:"Size"` // Part大小
  289. }
  290. // ListMultipartUploadResult ListMultipartUpload请求返回结果
  291. type ListMultipartUploadResult struct {
  292. XMLName xml.Name `xml:"ListMultipartUploadsResult"`
  293. Bucket string `xml:"Bucket"` // Bucket名称
  294. Delimiter string `xml:"Delimiter"` // 分组分割符
  295. Prefix string `xml:"Prefix"` // 筛选前缀
  296. KeyMarker string `xml:"KeyMarker"` // 起始Object位置
  297. UploadIDMarker string `xml:"UploadIdMarker"` // 起始UploadId位置
  298. NextKeyMarker string `xml:"NextKeyMarker"` // 如果没有全部返回,标明接下去的KeyMarker位置
  299. NextUploadIDMarker string `xml:"NextUploadIdMarker"` // 如果没有全部返回,标明接下去的UploadId位置
  300. MaxUploads int `xml:"MaxUploads"` // 返回最大Upload数目
  301. IsTruncated bool `xml:"IsTruncated"` // 是否完全返回
  302. Uploads []UncompletedUpload `xml:"Upload"` // 未完成上传的MultipartUpload
  303. CommonPrefixes []string `xml:"CommonPrefixes>Prefix"` // 所有名字包含指定的前缀且第一次出现delimiter字符之间的object作为一组的分组结果
  304. }
  305. // UncompletedUpload 未完成的Upload任务
  306. type UncompletedUpload struct {
  307. XMLName xml.Name `xml:"Upload"`
  308. Key string `xml:"Key"` // Object名称
  309. UploadID string `xml:"UploadId"` // 对应UploadId
  310. Initiated time.Time `xml:"Initiated"` // 初始化时间,格式2012-02-23T04:18:23.000Z
  311. }
  312. // 解析URL编码
  313. func decodeDeleteObjectsResult(result *DeleteObjectsResult) error {
  314. var err error
  315. for i := 0; i < len(result.DeletedObjects); i++ {
  316. result.DeletedObjects[i], err = url.QueryUnescape(result.DeletedObjects[i])
  317. if err != nil {
  318. return err
  319. }
  320. }
  321. return nil
  322. }
  323. // 解析URL编码
  324. func decodeListObjectsResult(result *ListObjectsResult) error {
  325. var err error
  326. result.Prefix, err = url.QueryUnescape(result.Prefix)
  327. if err != nil {
  328. return err
  329. }
  330. result.Marker, err = url.QueryUnescape(result.Marker)
  331. if err != nil {
  332. return err
  333. }
  334. result.Delimiter, err = url.QueryUnescape(result.Delimiter)
  335. if err != nil {
  336. return err
  337. }
  338. result.NextMarker, err = url.QueryUnescape(result.NextMarker)
  339. if err != nil {
  340. return err
  341. }
  342. for i := 0; i < len(result.Objects); i++ {
  343. result.Objects[i].Key, err = url.QueryUnescape(result.Objects[i].Key)
  344. if err != nil {
  345. return err
  346. }
  347. }
  348. for i := 0; i < len(result.CommonPrefixes); i++ {
  349. result.CommonPrefixes[i], err = url.QueryUnescape(result.CommonPrefixes[i])
  350. if err != nil {
  351. return err
  352. }
  353. }
  354. return nil
  355. }
  356. // 解析URL编码
  357. func decodeListMultipartUploadResult(result *ListMultipartUploadResult) error {
  358. var err error
  359. result.Prefix, err = url.QueryUnescape(result.Prefix)
  360. if err != nil {
  361. return err
  362. }
  363. result.Delimiter, err = url.QueryUnescape(result.Delimiter)
  364. if err != nil {
  365. return err
  366. }
  367. result.KeyMarker, err = url.QueryUnescape(result.KeyMarker)
  368. if err != nil {
  369. return err
  370. }
  371. result.NextKeyMarker, err = url.QueryUnescape(result.NextKeyMarker)
  372. if err != nil {
  373. return err
  374. }
  375. for i := 0; i < len(result.Uploads); i++ {
  376. result.Uploads[i].Key, err = url.QueryUnescape(result.Uploads[i].Key)
  377. if err != nil {
  378. return err
  379. }
  380. }
  381. for i := 0; i < len(result.CommonPrefixes); i++ {
  382. result.CommonPrefixes[i], err = url.QueryUnescape(result.CommonPrefixes[i])
  383. if err != nil {
  384. return err
  385. }
  386. }
  387. return nil
  388. }