options.go 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. package tos
  2. import (
  3. "net/http"
  4. "time"
  5. )
  6. type Option func(*requestBuilder)
  7. // WithContentType set Content-Type header
  8. // used in Bucket.PutObject Bucket.AppendObject Bucket.CreateMultipartUpload Bucket.SetObjectMeta
  9. func WithContentType(contentType string) Option {
  10. return func(rb *requestBuilder) {
  11. rb.Header.Set(HeaderContentType, contentType)
  12. }
  13. }
  14. // WithContentLength set Content-Length header
  15. // used in Bucket.PutObject Bucket.AppendObject Bucket.UploadPart
  16. //
  17. // If the length of the content is known, it is better to add this option when Put, Append or Upload.
  18. func WithContentLength(length int64) Option {
  19. return func(rb *requestBuilder) {
  20. rb.WithContentLength(length)
  21. }
  22. }
  23. // WithCacheControl set Cache-Control header
  24. // used in Bucket.PutObject Bucket.AppendObject
  25. // Bucket.CreateMultipartUpload Bucket.SetObjectMeta
  26. func WithCacheControl(cacheControl string) Option {
  27. return func(rb *requestBuilder) {
  28. rb.Header.Set(HeaderCacheControl, cacheControl)
  29. }
  30. }
  31. // WithContentDisposition set Content-Disposition header
  32. // used in Bucket.PutObject Bucket.AppendObject Bucket.CreateMultipartUpload Bucket.SetObjectMeta
  33. func WithContentDisposition(contentDisposition string) Option {
  34. return func(rb *requestBuilder) {
  35. rb.Header.Set(HeaderContentDisposition, contentDisposition)
  36. }
  37. }
  38. // WithContentEncoding set Content-Encoding header
  39. // used in Bucket.PutObject Bucket.AppendObject Bucket.CreateMultipartUpload Bucket.SetObjectMeta
  40. func WithContentEncoding(contentEncoding string) Option {
  41. return func(rb *requestBuilder) {
  42. rb.Header.Set(HeaderContentEncoding, contentEncoding)
  43. }
  44. }
  45. // WithContentLanguage set Content-Language header
  46. // used in Bucket.PutObject Bucket.AppendObject Bucket.CreateMultipartUpload Bucket.SetObjectMeta
  47. func WithContentLanguage(contentLanguage string) Option {
  48. return func(rb *requestBuilder) {
  49. rb.Header.Set(HeaderContentLanguage, contentLanguage)
  50. }
  51. }
  52. // WithContentMD5 set Content-MD5 header
  53. func WithContentMD5(contentMD5 string) Option {
  54. return func(rb *requestBuilder) {
  55. rb.Header.Set(HeaderContentMD5, contentMD5)
  56. }
  57. }
  58. // WithContentSHA256 set X-Tos-Content-Sha256 header
  59. func WithContentSHA256(contentSHA256 string) Option {
  60. return func(rb *requestBuilder) {
  61. rb.Header.Set(HeaderContentSha256, contentSHA256)
  62. }
  63. }
  64. // WithExpires set Expires header
  65. // used in Bucket.PutObject Bucket.AppendObject Bucket.CreateMultipartUpload Bucket.SetObjectMeta
  66. func WithExpires(expires time.Time) Option {
  67. return func(rb *requestBuilder) {
  68. rb.Header.Set(HeaderExpires, expires.Format(http.TimeFormat))
  69. }
  70. }
  71. // WithServerSideEncryptionCustomer set server-side-encryption parameters
  72. // used in Bucket.PutObject Bucket.CreateMultipartUpload
  73. func WithServerSideEncryptionCustomer(ssecAlgorithm, ssecKey, ssecKeyMD5 string) Option {
  74. return func(rb *requestBuilder) {
  75. rb.Header.Set(HeaderSSECustomerAlgorithm, ssecAlgorithm)
  76. rb.Header.Set(HeaderSSECustomerKey, ssecKey)
  77. rb.Header.Set(HeaderSSECustomerKeyMD5, ssecKeyMD5)
  78. }
  79. }
  80. // WithIfModifiedSince set If-Modified-Since header
  81. // used in Bucket.GetObject Bucket.HeadObject
  82. func WithIfModifiedSince(since time.Time) Option {
  83. return func(rb *requestBuilder) {
  84. rb.Header.Set(HeaderIfModifiedSince, since.Format(http.TimeFormat))
  85. }
  86. }
  87. // WithIfUnmodifiedSince set If-Unmodified-Since header
  88. // used in Bucket.GetObject Bucket.HeadObject
  89. func WithIfUnmodifiedSince(since time.Time) Option {
  90. return func(rb *requestBuilder) {
  91. rb.Header.Set(HeaderIfUnmodifiedSince, since.Format(http.TimeFormat))
  92. }
  93. }
  94. // WithIfMatch set If-Match header
  95. func WithIfMatch(ifMatch string) Option {
  96. return func(rb *requestBuilder) {
  97. rb.Header.Set(HeaderIfMatch, ifMatch)
  98. }
  99. }
  100. // WithIfNoneMatch set If-None-Match header
  101. func WithIfNoneMatch(ifNoneMatch string) Option {
  102. return func(rb *requestBuilder) {
  103. rb.Header.Set(HeaderIfNoneMatch, ifNoneMatch)
  104. }
  105. }
  106. // WithCopySourceIfMatch set X-Tos-Copy-Source-If-Match header
  107. // used in Bucket.CopyObject Bucket.CopyObjectTo Bucket.CopyObjectFrom Bucket.UploadPartCopy
  108. func WithCopySourceIfMatch(ifMatch string) Option {
  109. return func(rb *requestBuilder) {
  110. rb.Header.Set(HeaderCopySourceIfMatch, ifMatch)
  111. }
  112. }
  113. // WithCopySourceIfNoneMatch set X-Tos-Copy-Source-If-None-Match
  114. // used in Bucket.CopyObject Bucket.CopyObjectTo Bucket.CopyObjectFrom Bucket.UploadPartCopy
  115. func WithCopySourceIfNoneMatch(ifNoneMatch string) Option {
  116. return func(rb *requestBuilder) {
  117. rb.Header.Set(HeaderCopySourceIfNoneMatch, ifNoneMatch)
  118. }
  119. }
  120. // WithCopySourceIfModifiedSince set X-Tos-Copy-Source-If-Modified-Since header
  121. // used in Bucket.CopyObject Bucket.CopyObjectTo Bucket.CopyObjectFrom Bucket.UploadPartCopy
  122. func WithCopySourceIfModifiedSince(ifModifiedSince string) Option {
  123. return func(rb *requestBuilder) {
  124. rb.Header.Set(HeaderCopySourceIfModifiedSince, ifModifiedSince)
  125. }
  126. }
  127. // WithCopySourceIfUnmodifiedSince set X-Tos-Copy-Source-If-Unmodified-Since header
  128. // used in Bucket.CopyObject Bucket.CopyObjectTo Bucket.CopyObjectFrom Bucket.UploadPartCopy
  129. func WithCopySourceIfUnmodifiedSince(ifUnmodifiedSince string) Option {
  130. return func(rb *requestBuilder) {
  131. rb.Header.Set(HeaderCopySourceIfUnmodifiedSince, ifUnmodifiedSince)
  132. }
  133. }
  134. // WithMeta set meta header
  135. // used in Bucket.PutObject Bucket.CreateMultipartUpload Bucket.AppendObject Bucket.SetObjectMeta
  136. func WithMeta(key, value string) Option {
  137. return func(rb *requestBuilder) {
  138. rb.Header.Set(HeaderMetaPrefix+key, value)
  139. }
  140. }
  141. // WithRange set Range header
  142. // used in Bucket.GetObject Bucket.HeadObject
  143. func WithRange(start, end int64) Option {
  144. return func(rb *requestBuilder) {
  145. rb.Range = &Range{Start: start, End: end}
  146. rb.Header.Set(HeaderRange, rb.Range.String())
  147. }
  148. }
  149. // WithVersionID set version parameter
  150. // used in Bucket.GetObject Bucket.HeadObject Bucket.DeleteObject
  151. // Bucket.GetObjectAcl Bucket.SetObjectMeta
  152. // Bucket.CopyObject Bucket.CopyObjectTo Bucket.CopyObjectFrom
  153. // Client.PreSignedURL
  154. func WithVersionID(versionID string) Option {
  155. return func(rb *requestBuilder) {
  156. rb.Query.Add("versionId", versionID)
  157. }
  158. }
  159. // WithMetadataDirective set X-Tos-Metadata-Directive header
  160. // used in Bucket.CopyObject Bucket.CopyObjectTo Bucket.CopyObjectFrom
  161. func WithMetadataDirective(directive string) Option {
  162. return func(rb *requestBuilder) {
  163. rb.Header.Add(HeaderMetadataDirective, directive)
  164. }
  165. }
  166. // WithACL set X-Tos-Acl header
  167. // used in Bucket.PutObject Bucket.CreateMultipartUpload Bucket.AppendObject
  168. func WithACL(acl string) Option {
  169. return func(rb *requestBuilder) {
  170. rb.Header.Set(HeaderACL, acl)
  171. }
  172. }
  173. // WithACLGrantFullControl X-Tos-Grant-Full-Control header
  174. // used in Bucket.PutObject Bucket.CreateMultipartUpload Bucket.AppendObject
  175. func WithACLGrantFullControl(grantFullControl string) Option {
  176. return func(rb *requestBuilder) {
  177. rb.Header.Set(HeaderGrantFullControl, grantFullControl)
  178. }
  179. }
  180. // WithACLGrantRead set X-Tos-Grant-Read header
  181. // used in Bucket.PutObject Bucket.CreateMultipartUpload Bucket.AppendObject
  182. func WithACLGrantRead(grantRead string) Option {
  183. return func(rb *requestBuilder) {
  184. rb.Header.Set(HeaderGrantRead, grantRead)
  185. }
  186. }
  187. // WithACLGrantReadAcp set X-Tos-Grant-Read-Acp header
  188. // used in Bucket.PutObject Bucket.CreateMultipartUpload Bucket.AppendObject
  189. func WithACLGrantReadAcp(grantReadAcp string) Option {
  190. return func(rb *requestBuilder) {
  191. rb.Header.Set(HeaderGrantReadAcp, grantReadAcp)
  192. }
  193. }
  194. // WithACLGrantWrite set X-Tos-Grant-Write header
  195. // used in Bucket.PutObject Bucket.CreateMultipartUpload Bucket.AppendObject
  196. func WithACLGrantWrite(grantWrite string) Option {
  197. return func(rb *requestBuilder) {
  198. rb.Header.Set(HeaderGrantWrite, grantWrite)
  199. }
  200. }
  201. // WithACLGrantWriteAcp set X-Tos-Grant-Write-Acp header
  202. // used in Bucket.PutObject Bucket.CreateMultipartUpload Bucket.AppendObject
  203. func WithACLGrantWriteAcp(grantWriteAcp string) Option {
  204. return func(rb *requestBuilder) {
  205. rb.Header.Set(HeaderGrantWriteAcp, grantWriteAcp)
  206. }
  207. }
  208. // WithWebsiteRedirectLocation set X-Tos-Website-Redirect-Location header
  209. func WithWebsiteRedirectLocation(redirectLocation string) Option {
  210. return func(rb *requestBuilder) {
  211. rb.Header.Set(HeaderWebsiteRedirectLocation, redirectLocation)
  212. }
  213. }
  214. // WithPerRequestSigner set Signer for a request
  215. //
  216. // use this option when you need set request-level signature parameter(s).
  217. // for example, use different ak and sk for each request.
  218. //
  219. // if 'signer' set to nil, the request will not be signed.
  220. func WithPerRequestSigner(signer Signer) Option {
  221. return func(rb *requestBuilder) {
  222. rb.Signer = signer
  223. }
  224. }
  225. // WithHeader add request http header.
  226. //
  227. // NOTICE: use it carefully.
  228. func WithHeader(key, value string) Option {
  229. return func(rb *requestBuilder) {
  230. rb.Header.Set(key, value)
  231. }
  232. }
  233. // WithQuery add request query parameter
  234. //
  235. // NOTICE: use it carefully.
  236. func WithQuery(key, value string) Option {
  237. return func(rb *requestBuilder) {
  238. rb.Query.Set(key, value)
  239. }
  240. }