| @@ -1,10 +1,17 @@ | |||
| package cdsapi | |||
| import ( | |||
| "context" | |||
| "fmt" | |||
| "io" | |||
| "mime" | |||
| "net/http" | |||
| "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/pkgs/iterator" | |||
| "gitlink.org.cn/cloudream/common/sdks" | |||
| @@ -146,6 +153,69 @@ func (c *PackageService) CreateLoad(req PackageCreateLoad) (*PackageCreateLoadRe | |||
| 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" | |||
| type PackageDelete struct { | |||