parse_output.go 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. package tos
  2. import (
  3. "net/http"
  4. "strconv"
  5. )
  6. // ParseListObjectsType2Output Parse the incoming parameters of *http.Response type, and respond to the return value of *ListObjectsType2Output type.
  7. func ParseListObjectsType2Output(httpRes *http.Response) (*ListObjectsType2Output, error) {
  8. res := &Response{
  9. StatusCode: httpRes.StatusCode,
  10. ContentLength: httpRes.ContentLength,
  11. Header: httpRes.Header,
  12. Body: httpRes.Body,
  13. }
  14. err := checkError(res, true, 200)
  15. if err != nil {
  16. return nil, err
  17. }
  18. defer res.Close()
  19. temp := listObjectsType2Output{
  20. RequestInfo: res.RequestInfo(),
  21. }
  22. if err = marshalOutput(temp.RequestID, res.Body, &temp); err != nil {
  23. return nil, err
  24. }
  25. contents := make([]ListedObjectV2, 0, len(temp.Contents))
  26. for _, object := range temp.Contents {
  27. var hashCrc uint64
  28. if len(object.HashCrc64ecma) == 0 {
  29. hashCrc = 0
  30. } else {
  31. hashCrc, err = strconv.ParseUint(object.HashCrc64ecma, 10, 64)
  32. if err != nil {
  33. return nil, &TosServerError{
  34. TosError: TosError{Message: "tos: server returned invalid HashCrc64Ecma"},
  35. RequestInfo: RequestInfo{RequestID: temp.RequestID},
  36. }
  37. }
  38. }
  39. contents = append(contents, ListedObjectV2{
  40. Key: object.Key,
  41. LastModified: object.LastModified,
  42. ETag: object.ETag,
  43. Size: object.Size,
  44. Owner: object.Owner,
  45. StorageClass: object.StorageClass,
  46. HashCrc64ecma: hashCrc,
  47. })
  48. }
  49. output := ListObjectsType2Output{
  50. RequestInfo: temp.RequestInfo,
  51. Name: temp.Name,
  52. ContinuationToken: temp.ContinuationToken,
  53. Prefix: temp.Prefix,
  54. MaxKeys: temp.MaxKeys,
  55. KeyCount: temp.KeyCount,
  56. Delimiter: temp.Delimiter,
  57. IsTruncated: temp.IsTruncated,
  58. EncodingType: temp.EncodingType,
  59. CommonPrefixes: temp.CommonPrefixes,
  60. NextContinuationToken: temp.NextContinuationToken,
  61. Contents: contents,
  62. }
  63. return &output, nil
  64. }
  65. // ParseListObjectsV2Output Parse the incoming parameters of *http.Response type, and respond to the return value of *ListObjectsV2Output type.
  66. func ParseListObjectsV2Output(httpRes *http.Response) (*ListObjectsV2Output, error) {
  67. res := &Response{
  68. StatusCode: httpRes.StatusCode,
  69. ContentLength: httpRes.ContentLength,
  70. Header: httpRes.Header,
  71. Body: httpRes.Body,
  72. }
  73. err := checkError(res, true, 200)
  74. if err != nil {
  75. return nil, err
  76. }
  77. defer res.Close()
  78. temp := listObjectsV2Output{
  79. RequestInfo: res.RequestInfo(),
  80. }
  81. if err = marshalOutput(temp.RequestID, res.Body, &temp); err != nil {
  82. return nil, err
  83. }
  84. contents := make([]ListedObjectV2, 0, len(temp.Contents))
  85. for _, object := range temp.Contents {
  86. var hashCrc uint64
  87. if len(object.HashCrc64ecma) == 0 {
  88. hashCrc = 0
  89. } else {
  90. hashCrc, err = strconv.ParseUint(object.HashCrc64ecma, 10, 64)
  91. if err != nil {
  92. return nil, &TosServerError{
  93. TosError: TosError{Message: "tos: server returned invalid HashCrc64Ecma"},
  94. RequestInfo: RequestInfo{RequestID: temp.RequestID},
  95. }
  96. }
  97. }
  98. contents = append(contents, ListedObjectV2{
  99. Key: object.Key,
  100. LastModified: object.LastModified,
  101. ETag: object.ETag,
  102. Size: object.Size,
  103. Owner: object.Owner,
  104. StorageClass: object.StorageClass,
  105. HashCrc64ecma: uint64(hashCrc),
  106. })
  107. }
  108. output := ListObjectsV2Output{
  109. RequestInfo: temp.RequestInfo,
  110. Name: temp.Name,
  111. Prefix: temp.Prefix,
  112. Marker: temp.Marker,
  113. MaxKeys: temp.MaxKeys,
  114. NextMarker: temp.NextMarker,
  115. Delimiter: temp.Delimiter,
  116. IsTruncated: temp.IsTruncated,
  117. EncodingType: temp.EncodingType,
  118. CommonPrefixes: temp.CommonPrefixes,
  119. Contents: contents,
  120. }
  121. return &output, nil
  122. }
  123. // ParseListObjectVersionsV2Output Parse the incoming parameters of *http.Response type, and respond to the return value of *ListObjectVersionsV2Output type.
  124. func ParseListObjectVersionsV2Output(httpRes *http.Response) (*ListObjectVersionsV2Output, error) {
  125. res := &Response{
  126. StatusCode: httpRes.StatusCode,
  127. ContentLength: httpRes.ContentLength,
  128. Header: httpRes.Header,
  129. Body: httpRes.Body,
  130. }
  131. err := checkError(res, true, 200)
  132. if err != nil {
  133. return nil, err
  134. }
  135. defer res.Close()
  136. temp := listObjectVersionsV2Output{RequestInfo: res.RequestInfo()}
  137. if err = marshalOutput(temp.RequestID, res.Body, &temp); err != nil {
  138. return nil, err
  139. }
  140. versions := make([]ListedObjectVersionV2, 0, len(temp.Versions))
  141. for _, version := range temp.Versions {
  142. var hashCrc uint64
  143. if len(version.HashCrc64ecma) == 0 {
  144. hashCrc = 0
  145. } else {
  146. hashCrc, err = strconv.ParseUint(version.HashCrc64ecma, 10, 64)
  147. if err != nil {
  148. return nil, &TosServerError{
  149. TosError: TosError{Message: "tos: server returned invalid HashCrc64Ecma"},
  150. RequestInfo: RequestInfo{RequestID: temp.RequestID},
  151. }
  152. }
  153. }
  154. versions = append(versions, ListedObjectVersionV2{
  155. Key: version.Key,
  156. LastModified: version.LastModified,
  157. ETag: version.ETag,
  158. IsLatest: version.IsLatest,
  159. Size: version.Size,
  160. Owner: version.Owner,
  161. StorageClass: version.StorageClass,
  162. VersionID: version.VersionID,
  163. HashCrc64ecma: hashCrc,
  164. })
  165. }
  166. output := ListObjectVersionsV2Output{
  167. RequestInfo: temp.RequestInfo,
  168. Name: temp.Name,
  169. Prefix: temp.Prefix,
  170. KeyMarker: temp.KeyMarker,
  171. VersionIDMarker: temp.VersionIDMarker,
  172. Delimiter: temp.Delimiter,
  173. EncodingType: temp.EncodingType,
  174. MaxKeys: temp.MaxKeys,
  175. NextKeyMarker: temp.NextKeyMarker,
  176. NextVersionIDMarker: temp.NextVersionIDMarker,
  177. IsTruncated: temp.IsTruncated,
  178. CommonPrefixes: temp.CommonPrefixes,
  179. DeleteMarkers: temp.DeleteMarkers,
  180. Versions: versions,
  181. }
  182. return &output, nil
  183. }
  184. // ParseHeadObjectV2Output Parse the incoming parameters of *http.Response type, and respond to the return value of *HeadObjectV2Output type.
  185. func ParseHeadObjectV2Output(httpRes *http.Response) (*HeadObjectV2Output, error) {
  186. res := &Response{
  187. StatusCode: httpRes.StatusCode,
  188. ContentLength: httpRes.ContentLength,
  189. Header: httpRes.Header,
  190. Body: httpRes.Body,
  191. }
  192. err := checkError(res, false, 200)
  193. if err != nil {
  194. return nil, err
  195. }
  196. defer res.Close()
  197. output := HeadObjectV2Output{
  198. RequestInfo: res.RequestInfo(),
  199. }
  200. output.ObjectMetaV2.fromResponseV2(res)
  201. return &output, nil
  202. }
  203. // ParseGetObjectV2Output Parse the incoming parameters of *http.Response type, and respond to the return value of *GetObjectV2Output type.
  204. func ParseGetObjectV2Output(httpRes *http.Response, expectedCode int) (*GetObjectV2Output, error) {
  205. res := &Response{
  206. StatusCode: httpRes.StatusCode,
  207. ContentLength: httpRes.ContentLength,
  208. Header: httpRes.Header,
  209. Body: httpRes.Body,
  210. }
  211. err := checkError(res, true, expectedCode)
  212. if err != nil {
  213. return nil, err
  214. }
  215. basic := GetObjectBasicOutput{
  216. RequestInfo: res.RequestInfo(),
  217. ContentRange: res.Header.Get(HeaderContentRange),
  218. }
  219. basic.ObjectMetaV2.fromResponseV2(res)
  220. output := GetObjectV2Output{
  221. GetObjectBasicOutput: basic,
  222. Content: wrapReader(res.Body, res.ContentLength, nil, nil, nil),
  223. }
  224. return &output, nil
  225. }