metadata.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. package tos
  2. import (
  3. "net/http"
  4. "net/url"
  5. "strconv"
  6. "strings"
  7. "time"
  8. "github.com/volcengine/ve-tos-golang-sdk/v2/tos/enum"
  9. )
  10. // ObjectMeta object metadata
  11. type ObjectMeta struct {
  12. ContentLength int64 `json:"ContentLength,omitempty"`
  13. ContentType string `json:"ContentType,omitempty"`
  14. ContentMD5 string `json:"ContentMD5,omitempty"`
  15. ContentLanguage string `json:"ContentLanguage,omitempty"`
  16. ContentEncoding string `json:"ContentEncoding,omitempty"`
  17. ContentDisposition string `json:"ContentDisposition,omitempty"`
  18. LastModified string `json:"LastModified,omitempty"`
  19. CacheControl string `json:"CacheControl,omitempty"`
  20. Expires string `json:"Expires,omitempty"`
  21. ETag string `json:"ETag,omitempty"`
  22. VersionID string `json:"VersionId,omitempty"`
  23. DeleteMarker bool `json:"DeleteMarker,omitempty"`
  24. ObjectType string `json:"ObjectType,omitempty"` // "" or "Appendable"
  25. StorageClass string `json:"StorageClass,omitempty"`
  26. Restore string `json:"Restore,omitempty"`
  27. Metadata map[string]string `json:"Metadata,omitempty"`
  28. Tag string `json:"Tag,omitempty"`
  29. SSECustomerAlgorithm string `json:"SSECustomerAlgorithm,omitempty"`
  30. SSECustomerKeyMD5 string `json:"SSECustomerKeyMD5,omitempty"`
  31. CSType string `json:"CSType,omitempty"`
  32. }
  33. type ObjectMetaV2 struct {
  34. ETag string
  35. LastModified time.Time
  36. DeleteMarker bool
  37. SSECAlgorithm string
  38. SSECKeyMD5 string
  39. VersionID string
  40. WebsiteRedirectLocation string
  41. ObjectType string
  42. HashCrc64ecma uint64
  43. StorageClass enum.StorageClassType
  44. Meta Metadata
  45. ContentLength int64
  46. ContentType string
  47. CacheControl string
  48. ContentDisposition string
  49. ContentEncoding string
  50. ContentLanguage string
  51. Expires time.Time
  52. ServerSideEncryption string
  53. ServerSideEncryptionKeyID string
  54. }
  55. func (om *ObjectMeta) fromResponse(res *Response) {
  56. om.ETag = res.Header.Get(HeaderETag)
  57. om.LastModified = res.Header.Get(HeaderLastModified)
  58. om.DeleteMarker, _ = strconv.ParseBool(res.Header.Get(HeaderDeleteMarker))
  59. om.SSECustomerAlgorithm = res.Header.Get(HeaderSSECustomerAlgorithm)
  60. om.SSECustomerKeyMD5 = res.Header.Get(HeaderSSECustomerKeyMD5)
  61. om.VersionID = res.Header.Get(HeaderVersionID)
  62. om.ObjectType = res.Header.Get(HeaderObjectType)
  63. om.StorageClass = res.Header.Get(HeaderStorageClass)
  64. om.Metadata = userMetadata(res.Header)
  65. om.ContentLength = res.ContentLength
  66. om.ContentType = res.Header.Get(HeaderContentType)
  67. om.CacheControl = res.Header.Get(HeaderCacheControl)
  68. om.ContentDisposition = res.Header.Get(HeaderContentDisposition)
  69. om.ContentEncoding = res.Header.Get(HeaderContentEncoding)
  70. om.ContentLanguage = res.Header.Get(HeaderContentLanguage)
  71. om.Expires = res.Header.Get(HeaderExpires)
  72. om.ContentMD5 = res.Header.Get(HeaderContentMD5)
  73. om.Restore = res.Header.Get(HeaderRestore)
  74. om.Tag = res.Header.Get(HeaderTag)
  75. om.CSType = res.Header.Get(HeaderCSType)
  76. }
  77. func (om *ObjectMetaV2) fromResponseV2(res *Response) {
  78. lastModified, _ := time.ParseInLocation(http.TimeFormat, res.Header.Get(HeaderLastModified), time.UTC)
  79. deleteMarker, _ := strconv.ParseBool(res.Header.Get(HeaderDeleteMarker))
  80. // If s is empty or contains invalid digits, err.Err = ErrSyntax and the returned value is 0;
  81. crc64, _ := strconv.ParseUint(res.Header.Get(HeaderHashCrc64ecma), 10, 64)
  82. length, _ := strconv.ParseInt(res.Header.Get(HeaderContentLength), 10, 64)
  83. expires, _ := time.ParseInLocation(http.TimeFormat, res.Header.Get(HeaderExpires), time.UTC)
  84. om.ETag = res.Header.Get(HeaderETag)
  85. om.LastModified = lastModified
  86. om.DeleteMarker = deleteMarker
  87. om.SSECAlgorithm = res.Header.Get(HeaderSSECustomerAlgorithm)
  88. om.SSECKeyMD5 = res.Header.Get(HeaderContentMD5)
  89. om.VersionID = res.Header.Get(HeaderVersionID)
  90. om.WebsiteRedirectLocation = res.Header.Get(HeaderWebsiteRedirectLocation)
  91. om.ObjectType = res.Header.Get(HeaderObjectType)
  92. om.HashCrc64ecma = crc64
  93. om.StorageClass = enum.StorageClassType(res.Header.Get(HeaderStorageClass))
  94. om.Meta = &CustomMeta{m: userMetadata(res.Header)}
  95. om.ContentLength = length
  96. om.ContentType = res.Header.Get(HeaderContentType)
  97. om.CacheControl = res.Header.Get(HeaderCacheControl)
  98. om.ContentDisposition, _ = url.QueryUnescape(res.Header.Get(HeaderContentDisposition))
  99. om.ContentEncoding = res.Header.Get(HeaderContentEncoding)
  100. om.ContentLanguage = res.Header.Get(HeaderContentLanguage)
  101. om.Expires = expires
  102. om.ServerSideEncryption = res.Header.Get(HeaderServerSideEncryption)
  103. om.ServerSideEncryptionKeyID = res.Header.Get(HeaderServerSideEncryptionKmsKeyID)
  104. }
  105. func userMetadata(header http.Header) map[string]string {
  106. meta := make(map[string]string)
  107. for key := range header {
  108. if strings.HasPrefix(key, HeaderMetaPrefix) {
  109. kk, err := url.QueryUnescape(key[len(HeaderMetaPrefix):])
  110. if err != nil {
  111. kk = key[len(HeaderMetaPrefix):]
  112. }
  113. meta[strings.ToLower(kk)], err = url.QueryUnescape(header.Get(key))
  114. if err != nil {
  115. meta[strings.ToLower(kk)] = header.Get(key)
  116. }
  117. }
  118. }
  119. return meta
  120. }
  121. func parseUserMetaData(userMeta []userMeta) Metadata {
  122. if len(userMeta) == 0 {
  123. return nil
  124. }
  125. metas := make(map[string]string, len(userMeta))
  126. for _, meta := range userMeta {
  127. kk, err := url.QueryUnescape(meta.Key)
  128. if err != nil {
  129. kk = meta.Key
  130. }
  131. metas[strings.ToLower(kk)], err = url.QueryUnescape(meta.Value)
  132. if err != nil {
  133. metas[strings.ToLower(kk)] = meta.Value
  134. }
  135. }
  136. return &CustomMeta{metas}
  137. }