You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

utils.go 2.6 kB

1 year ago
1 year ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package cdsapi
  2. import (
  3. "context"
  4. "fmt"
  5. "io"
  6. "net/http"
  7. "path/filepath"
  8. "strings"
  9. "time"
  10. v4 "github.com/aws/aws-sdk-go-v2/aws/signer/v4"
  11. "github.com/aws/aws-sdk-go-v2/credentials"
  12. "gitlink.org.cn/cloudream/common/sdks"
  13. "gitlink.org.cn/cloudream/common/utils/http2"
  14. "gitlink.org.cn/cloudream/common/utils/math2"
  15. "gitlink.org.cn/cloudream/common/utils/serder"
  16. )
  17. func MakeIPFSFilePath(fileHash string) string {
  18. return filepath.Join("ipfs", fileHash)
  19. }
  20. func ParseJSONResponse[TBody any](resp *http.Response) (TBody, error) {
  21. var ret TBody
  22. contType := resp.Header.Get("Content-Type")
  23. if strings.Contains(contType, http2.ContentTypeJSON) {
  24. var err error
  25. if ret, err = serder.JSONToObjectStreamEx[TBody](resp.Body); err != nil {
  26. return ret, fmt.Errorf("parsing response: %w", err)
  27. }
  28. return ret, nil
  29. }
  30. cont, err := io.ReadAll(resp.Body)
  31. if err != nil {
  32. return ret, fmt.Errorf("unknow response content type: %s, status: %d", contType, resp.StatusCode)
  33. }
  34. strCont := string(cont)
  35. return ret, fmt.Errorf("unknow response content type: %s, status: %d, body(prefix): %s", contType, resp.StatusCode, strCont[:math2.Min(len(strCont), 200)])
  36. }
  37. func JSONAPI[Resp sdks.APIResponse, Req sdks.APIRequest](cfg *Config, cli *http.Client, req Req) (Resp, error) {
  38. var re Resp
  39. param := req.MakeParam()
  40. httpReq, err := param.MakeRequest(cfg.URL)
  41. if err != nil {
  42. return re, err
  43. }
  44. if cfg.AccessKey != "" && cfg.SecretKey != "" {
  45. prod := credentials.NewStaticCredentialsProvider(cfg.AccessKey, cfg.SecretKey, "")
  46. cred, err := prod.Retrieve(context.TODO())
  47. if err != nil {
  48. return re, err
  49. }
  50. signer := v4.NewSigner()
  51. err = signer.SignHTTP(context.Background(), cred, httpReq, "", AuthService, AuthRegion, time.Now())
  52. if err != nil {
  53. return re, err
  54. }
  55. }
  56. resp, err := cli.Do(httpReq)
  57. if err != nil {
  58. return re, err
  59. }
  60. err = re.ParseResponse(resp)
  61. return re, err
  62. }
  63. func JSONAPINoData[Resp sdks.APIResponse, Req sdks.APIRequest](cfg *Config, cli *http.Client, req Req) error {
  64. param := req.MakeParam()
  65. httpReq, err := param.MakeRequest(cfg.URL)
  66. if err != nil {
  67. return err
  68. }
  69. if cfg.AccessKey != "" && cfg.SecretKey != "" {
  70. prod := credentials.NewStaticCredentialsProvider(cfg.AccessKey, cfg.SecretKey, "")
  71. cred, err := prod.Retrieve(context.TODO())
  72. if err != nil {
  73. return err
  74. }
  75. signer := v4.NewSigner()
  76. err = signer.SignHTTP(context.Background(), cred, httpReq, "", AuthService, AuthRegion, time.Now())
  77. if err != nil {
  78. return err
  79. }
  80. }
  81. resp, err := cli.Do(httpReq)
  82. if err != nil {
  83. return err
  84. }
  85. return sdks.ParseCodeDataJSONResponse(resp, any(nil))
  86. }