| @@ -1,10 +1,17 @@ | |||||
| package cdsapi | package cdsapi | ||||
| import ( | import ( | ||||
| "context" | |||||
| "fmt" | "fmt" | ||||
| "io" | |||||
| "mime" | |||||
| "net/http" | "net/http" | ||||
| "net/url" | "net/url" | ||||
| "strings" | |||||
| "time" | |||||
| v4 "github.com/aws/aws-sdk-go-v2/aws/signer/v4" | |||||
| "github.com/aws/aws-sdk-go-v2/credentials" | |||||
| "gitlink.org.cn/cloudream/common/consts/errorcode" | "gitlink.org.cn/cloudream/common/consts/errorcode" | ||||
| "gitlink.org.cn/cloudream/common/pkgs/iterator" | "gitlink.org.cn/cloudream/common/pkgs/iterator" | ||||
| "gitlink.org.cn/cloudream/common/sdks" | "gitlink.org.cn/cloudream/common/sdks" | ||||
| @@ -146,6 +153,69 @@ func (c *PackageService) CreateLoad(req PackageCreateLoad) (*PackageCreateLoadRe | |||||
| return nil, codeResp.ToError() | return nil, codeResp.ToError() | ||||
| } | } | ||||
| const PackageDownloadPath = "/v1/package/download" | |||||
| type PackageDownload struct { | |||||
| UserID cdssdk.UserID `url:"userID" form:"userID" binding:"required"` | |||||
| PackageID cdssdk.PackageID `url:"packageID" form:"packageID" binding:"required"` | |||||
| } | |||||
| func (r *PackageDownload) MakeParam() *sdks.RequestParam { | |||||
| return sdks.MakeJSONParam(http.MethodGet, PackageDownloadPath, r) | |||||
| } | |||||
| type DownloadingPackage struct { | |||||
| Name string | |||||
| File io.ReadCloser | |||||
| } | |||||
| func (c *PackageService) Download(req PackageDownload) (*DownloadingPackage, error) { | |||||
| httpReq, err := req.MakeParam().MakeRequest(c.cfg.URL) | |||||
| if err != nil { | |||||
| return nil, err | |||||
| } | |||||
| if c.cfg.AccessKey != "" && c.cfg.SecretKey != "" { | |||||
| prod := credentials.NewStaticCredentialsProvider(c.cfg.AccessKey, c.cfg.SecretKey, "") | |||||
| cred, err := prod.Retrieve(context.TODO()) | |||||
| if err != nil { | |||||
| return nil, err | |||||
| } | |||||
| signer := v4.NewSigner() | |||||
| err = signer.SignHTTP(context.Background(), cred, httpReq, "", AuthService, AuthRegion, time.Now()) | |||||
| if err != nil { | |||||
| return nil, err | |||||
| } | |||||
| } | |||||
| resp, err := http.DefaultClient.Do(httpReq) | |||||
| if err != nil { | |||||
| return nil, err | |||||
| } | |||||
| contType := resp.Header.Get("Content-Type") | |||||
| if strings.Contains(contType, http2.ContentTypeJSON) { | |||||
| var codeResp response[any] | |||||
| if err := serder.JSONToObjectStream(resp.Body, &codeResp); err != nil { | |||||
| return nil, fmt.Errorf("parsing response: %w", err) | |||||
| } | |||||
| return nil, codeResp.ToError() | |||||
| } | |||||
| _, params, err := mime.ParseMediaType(resp.Header.Get("Content-Disposition")) | |||||
| if err != nil { | |||||
| return nil, fmt.Errorf("parsing content disposition: %w", err) | |||||
| } | |||||
| return &DownloadingPackage{ | |||||
| Name: params["filename"], | |||||
| File: resp.Body, | |||||
| }, nil | |||||
| } | |||||
| const PackageDeletePath = "/package/delete" | const PackageDeletePath = "/package/delete" | ||||
| type PackageDelete struct { | type PackageDelete struct { | ||||