Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

117 строки
3.5 KiB

  1. package sdk
  2. import (
  3. "context"
  4. "fmt"
  5. "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/auth"
  6. "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/requests"
  7. "golib.gaore.com/GaoreGo/gaore-common-sdk-go/sdk/responses"
  8. "net"
  9. "net/http"
  10. "runtime"
  11. "strings"
  12. "time"
  13. )
  14. var Version = "0.0.1"
  15. var defaultConnectTimeout = 5 * time.Second
  16. var defaultReadTimeout = 10 * time.Second
  17. var DefaultUserAgent = fmt.Sprintf("GaoreGoSdk (%s;%s) Golang/%s Core/%s", runtime.GOOS, runtime.GOARCH, strings.Trim(runtime.Version(), "go"), Version)
  18. type Client struct {
  19. Host string
  20. httpClient *http.Client
  21. isInsecure bool
  22. signer auth.Signer
  23. readTimeout time.Duration
  24. connectTimeout time.Duration
  25. config *Config
  26. }
  27. func (client *Client) InitWithOptions(host string, config *Config, credential auth.Credential) (err error) {
  28. client.httpClient = &http.Client{}
  29. if config.Transport != nil {
  30. client.httpClient.Transport = config.Transport
  31. } else if config.HttpTransport != nil {
  32. client.httpClient.Transport = config.HttpTransport
  33. }
  34. if config.Timeout > 0 {
  35. client.httpClient.Timeout = config.Timeout
  36. }
  37. client.signer, err = auth.NewSignerWithCredential(credential, client.ProcessCommonRequestWithSigner)
  38. return nil
  39. }
  40. func (client *Client) InitWithConfig() (config *Config) {
  41. if client.config != nil {
  42. return client.config
  43. } else {
  44. return NewConfig()
  45. }
  46. }
  47. func (client *Client) ProcessCommonRequestWithSigner(request *requests.CommonRequest, signerInterface interface{}) (response *responses.CommonResponse, err error) {
  48. if signer, isSigner := signerInterface.(auth.Signer); isSigner {
  49. response = responses.NewCommonResponse()
  50. err = client.DoActionWithSigner(request, response, signer)
  51. return
  52. }
  53. panic("should not be here")
  54. }
  55. func Timeout(connectTimeout time.Duration) func(ctx context.Context, net, addr string) (c net.Conn, err error) {
  56. return func(ctx context.Context, network, address string) (c net.Conn, err error) {
  57. return (&net.Dialer{
  58. Timeout: connectTimeout,
  59. DualStack: true,
  60. }).DialContext(ctx, network, address)
  61. }
  62. }
  63. func (client *Client) setTimeOut(request requests.AcsRequest) {
  64. readTimeout, connectTimeout := client.getTimeOut(request)
  65. client.httpClient.Timeout = readTimeout
  66. if trans, ok := client.httpClient.Transport.(*http.Transport); ok && trans != nil {
  67. trans.DialContext = Timeout(connectTimeout)
  68. client.httpClient.Transport = trans
  69. } else if client.httpClient.Transport == nil {
  70. client.httpClient.Transport = &http.Transport{
  71. DialContext: Timeout(connectTimeout),
  72. }
  73. }
  74. }
  75. func (client *Client) getTimeOut(request requests.AcsRequest) (time.Duration, time.Duration) {
  76. readTimeOut := defaultReadTimeout
  77. connectTimeOut := defaultConnectTimeout
  78. reqReadTimeout := request.GetReadTimeout()
  79. reqConnectTimeout := request.GetConnectTimeout()
  80. if reqReadTimeout != 0*time.Millisecond {
  81. readTimeOut = reqReadTimeout
  82. } else if client.readTimeout != 0*time.Microsecond {
  83. readTimeOut = client.readTimeout
  84. } else if client.httpClient.Timeout != 0 {
  85. readTimeOut = client.httpClient.Timeout
  86. }
  87. if reqConnectTimeout != 0*time.Microsecond {
  88. connectTimeOut = reqConnectTimeout
  89. } else if client.connectTimeout != 0*time.Millisecond {
  90. connectTimeOut = client.connectTimeout
  91. }
  92. return readTimeOut, connectTimeOut
  93. }
  94. func (client *Client) DoAction(request requests.AcsRequest, response responses.AcsResponse) (err error) {
  95. return client.DoActionWithSigner(request, response, nil)
  96. }
  97. func (client *Client) DoActionWithSigner(request requests.AcsRequest, response responses.AcsResponse, signer auth.Signer) (err error) {
  98. }