conf.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. package oss
  2. import (
  3. "bytes"
  4. "fmt"
  5. "log"
  6. "os"
  7. "time"
  8. )
  9. // Define the level of the output log
  10. const (
  11. LogOff = iota
  12. Error
  13. Warn
  14. Info
  15. Debug
  16. )
  17. // LogTag Tag for each level of log
  18. var LogTag = []string{"[error]", "[warn]", "[info]", "[debug]"}
  19. // HTTPTimeout defines HTTP timeout.
  20. type HTTPTimeout struct {
  21. ConnectTimeout time.Duration
  22. ReadWriteTimeout time.Duration
  23. HeaderTimeout time.Duration
  24. LongTimeout time.Duration
  25. IdleConnTimeout time.Duration
  26. }
  27. // HTTPMaxConns defines max idle connections and max idle connections per host
  28. type HTTPMaxConns struct {
  29. MaxIdleConns int
  30. MaxIdleConnsPerHost int
  31. }
  32. // AKInterface is interface for getting AccessKeyID, AccessKeySecret, SecurityToken
  33. type AKInterface interface {
  34. GetAccessKeyID() string
  35. GetAccessKeySecret() string
  36. GetSecurityToken() string
  37. }
  38. // Config defines oss configuration
  39. type Config struct {
  40. Endpoint string // OSS endpoint
  41. AccessKeyID string // AccessId
  42. AccessKeySecret string // AccessKey
  43. RetryTimes uint // Retry count by default it's 5.
  44. UserAgent string // SDK name/version/system information
  45. IsDebug bool // Enable debug mode. Default is false.
  46. Timeout uint // Timeout in seconds. By default it's 60.
  47. SecurityToken string // STS Token
  48. IsCname bool // If cname is in the endpoint.
  49. HTTPTimeout HTTPTimeout // HTTP timeout
  50. HTTPMaxConns HTTPMaxConns // Http max connections
  51. IsUseProxy bool // Flag of using proxy.
  52. ProxyHost string // Flag of using proxy host.
  53. IsAuthProxy bool // Flag of needing authentication.
  54. ProxyUser string // Proxy user
  55. ProxyPassword string // Proxy password
  56. IsEnableMD5 bool // Flag of enabling MD5 for upload.
  57. MD5Threshold int64 // Memory footprint threshold for each MD5 computation (16MB is the default), in byte. When the data is more than that, temp file is used.
  58. IsEnableCRC bool // Flag of enabling CRC for upload.
  59. LogLevel int // Log level
  60. Logger *log.Logger // For write log
  61. UploadLimitSpeed int // Upload limit speed:KB/s, 0 is unlimited
  62. UploadLimiter *OssLimiter // Bandwidth limit reader for upload
  63. UserAKInf AKInterface // User provides interface to get AccessKeyID, AccessKeySecret, SecurityToken
  64. }
  65. // LimitUploadSpeed uploadSpeed:KB/s, 0 is unlimited,default is 0
  66. func (config *Config) LimitUploadSpeed(uploadSpeed int) error {
  67. if uploadSpeed < 0 {
  68. return fmt.Errorf("invalid argument, the value of uploadSpeed is less than 0")
  69. } else if uploadSpeed == 0 {
  70. config.UploadLimitSpeed = 0
  71. config.UploadLimiter = nil
  72. return nil
  73. }
  74. var err error
  75. config.UploadLimiter, err = GetOssLimiter(uploadSpeed)
  76. if err == nil {
  77. config.UploadLimitSpeed = uploadSpeed
  78. }
  79. return err
  80. }
  81. // WriteLog output log function
  82. func (config *Config) WriteLog(LogLevel int, format string, a ...interface{}) {
  83. if config.LogLevel < LogLevel || config.Logger == nil {
  84. return
  85. }
  86. var logBuffer bytes.Buffer
  87. logBuffer.WriteString(LogTag[LogLevel-1])
  88. logBuffer.WriteString(fmt.Sprintf(format, a...))
  89. config.Logger.Printf("%s", logBuffer.String())
  90. }
  91. // for get AccessKeyID
  92. func (config *Config) GetAccessKeyID() string {
  93. if config.UserAKInf != nil {
  94. return config.UserAKInf.GetAccessKeyID()
  95. }
  96. return config.AccessKeyID
  97. }
  98. // for get AccessKeySecret
  99. func (config *Config) GetAccessKeySecret() string {
  100. if config.UserAKInf != nil {
  101. return config.UserAKInf.GetAccessKeySecret()
  102. }
  103. return config.AccessKeySecret
  104. }
  105. // for get SecurityToken
  106. func (config *Config) GetSecurityToken() string {
  107. if config.UserAKInf != nil {
  108. return config.UserAKInf.GetSecurityToken()
  109. }
  110. return config.SecurityToken
  111. }
  112. // getDefaultOssConfig gets the default configuration.
  113. func getDefaultOssConfig() *Config {
  114. config := Config{}
  115. config.Endpoint = ""
  116. config.AccessKeyID = ""
  117. config.AccessKeySecret = ""
  118. config.RetryTimes = 5
  119. config.IsDebug = false
  120. config.UserAgent = userAgent()
  121. config.Timeout = 60 // Seconds
  122. config.SecurityToken = ""
  123. config.IsCname = false
  124. config.HTTPTimeout.ConnectTimeout = time.Second * 30 // 30s
  125. config.HTTPTimeout.ReadWriteTimeout = time.Second * 60 // 60s
  126. config.HTTPTimeout.HeaderTimeout = time.Second * 60 // 60s
  127. config.HTTPTimeout.LongTimeout = time.Second * 300 // 300s
  128. config.HTTPTimeout.IdleConnTimeout = time.Second * 50 // 50s
  129. config.HTTPMaxConns.MaxIdleConns = 100
  130. config.HTTPMaxConns.MaxIdleConnsPerHost = 100
  131. config.IsUseProxy = false
  132. config.ProxyHost = ""
  133. config.IsAuthProxy = false
  134. config.ProxyUser = ""
  135. config.ProxyPassword = ""
  136. config.MD5Threshold = 16 * 1024 * 1024 // 16MB
  137. config.IsEnableMD5 = false
  138. config.IsEnableCRC = true
  139. config.LogLevel = LogOff
  140. config.Logger = log.New(os.Stdout, "", log.LstdFlags)
  141. return &config
  142. }