| @@ -34,7 +34,7 @@ type RequestParam struct { | |||
| func (p *RequestParam) MakeRequest(baseURL string) (*http.Request, error) { | |||
| var body io.ReadCloser | |||
| bodyLen := int64(-1) | |||
| bodyLen := int64(0) | |||
| if p.Body != nil { | |||
| body = p.Body.IntoStream() | |||
| bodyLen = p.Body.Length() | |||
| @@ -175,11 +175,16 @@ func ParseCodeDataJSONResponse[T any](resp *http.Response, ret T) error { | |||
| if strings.Contains(contType, http2.ContentTypeJSON) { | |||
| var err error | |||
| var r CodeDataResponse[T] | |||
| r.Data = ret | |||
| if err = serder.JSONToObjectStreamExRaw(resp.Body, &r); err != nil { | |||
| return fmt.Errorf("parsing response: %w", err) | |||
| } | |||
| if r.Code != errorcode.OK { | |||
| return &CodeMessageError{Code: r.Code, Message: r.Message} | |||
| } | |||
| return nil | |||
| } | |||
| @@ -35,7 +35,7 @@ func (r *BucketGetByNameResp) ParseResponse(resp *http.Response) error { | |||
| } | |||
| func (c *BucketService) GetByName(req BucketGetByName) (*BucketGetByNameResp, error) { | |||
| return JSONAPI[*BucketGetByNameResp](c.cfg, http.DefaultClient, &req) | |||
| return JSONAPI(c.cfg, http.DefaultClient, &req, &BucketGetByNameResp{}) | |||
| } | |||
| const BucketCreatePath = "/bucket/create" | |||
| @@ -58,7 +58,7 @@ func (r *BucketCreateResp) ParseResponse(resp *http.Response) error { | |||
| } | |||
| func (c *BucketService) Create(req BucketCreate) (*BucketCreateResp, error) { | |||
| return JSONAPI[*BucketCreateResp](c.cfg, http.DefaultClient, &req) | |||
| return JSONAPI(c.cfg, http.DefaultClient, &req, &BucketCreateResp{}) | |||
| } | |||
| const BucketDeletePath = "/bucket/delete" | |||
| @@ -79,7 +79,7 @@ func (r *BucketDeleteResp) ParseResponse(resp *http.Response) error { | |||
| } | |||
| func (c *BucketService) Delete(req BucketDelete) error { | |||
| return JSONAPINoData[*BucketDeleteResp](c.cfg, http.DefaultClient, &req) | |||
| return JSONAPINoData(c.cfg, http.DefaultClient, &req) | |||
| } | |||
| const BucketListUserBucketsPath = "/bucket/listUserBuckets" | |||
| @@ -101,5 +101,5 @@ func (r *BucketListUserBucketsResp) ParseResponse(resp *http.Response) error { | |||
| } | |||
| func (c *BucketService) ListUserBuckets(req BucketListUserBucketsReq) (*BucketListUserBucketsResp, error) { | |||
| return JSONAPI[*BucketListUserBucketsResp](c.cfg, http.DefaultClient, &req) | |||
| return JSONAPI(c.cfg, http.DefaultClient, &req, &BucketListUserBucketsResp{}) | |||
| } | |||
| @@ -26,5 +26,5 @@ func (r *CacheMovePackageResp) ParseResponse(resp *http.Response) error { | |||
| } | |||
| func (c *Client) CacheMovePackage(req CacheMovePackageReq) (*CacheMovePackageResp, error) { | |||
| return JSONAPI[*CacheMovePackageResp](c.cfg, http.DefaultClient, &req) | |||
| return JSONAPI(c.cfg, http.DefaultClient, &req, &CacheMovePackageResp{}) | |||
| } | |||
| @@ -26,5 +26,5 @@ func (r *HubGetHubsResp) ParseResponse(resp *http.Response) error { | |||
| } | |||
| func (c *Client) HubGetHubs(req HubGetHubsReq) (*HubGetHubsResp, error) { | |||
| return JSONAPI[*HubGetHubsResp](c.cfg, http.DefaultClient, &req) | |||
| return JSONAPI(c.cfg, http.DefaultClient, &req, &HubGetHubsResp{}) | |||
| } | |||
| @@ -55,7 +55,7 @@ func (r *ObjectListByPathResp) ParseResponse(resp *http.Response) error { | |||
| } | |||
| func (c *ObjectService) ListByPath(req ObjectListByPath) (*ObjectListByPathResp, error) { | |||
| return JSONAPI[*ObjectListByPathResp](c.cfg, http.DefaultClient, &req) | |||
| return JSONAPI(c.cfg, http.DefaultClient, &req, &ObjectListByPathResp{}) | |||
| } | |||
| const ObjectListByIDsPath = "/object/listByIDs" | |||
| @@ -78,7 +78,7 @@ func (r *ObjectListByIDsResp) ParseResponse(resp *http.Response) error { | |||
| } | |||
| func (c *ObjectService) ListByIDs(req ObjectListByIDs) (*ObjectListByIDsResp, error) { | |||
| return JSONAPI[*ObjectListByIDsResp](c.cfg, http.DefaultClient, &req) | |||
| return JSONAPI(c.cfg, http.DefaultClient, &req, &ObjectListByIDsResp{}) | |||
| } | |||
| const ObjectUploadPath = "/object/upload" | |||
| @@ -108,6 +108,10 @@ type ObjectUploadResp struct { | |||
| } | |||
| func (c *ObjectService) Upload(req ObjectUpload) (*ObjectUploadResp, error) { | |||
| type uploadInfo struct { | |||
| Info string `url:"info"` | |||
| } | |||
| url, err := url.JoinPath(c.cfg.URL, ObjectUploadPath) | |||
| if err != nil { | |||
| return nil, err | |||
| @@ -119,7 +123,7 @@ func (c *ObjectService) Upload(req ObjectUpload) (*ObjectUploadResp, error) { | |||
| } | |||
| resp, err := PostMultiPart(c.cfg, url, | |||
| map[string]string{"info": string(infoJSON)}, | |||
| uploadInfo{Info: string(infoJSON)}, | |||
| iterator.Map(req.Files, func(src *UploadingObject) (*http2.IterMultiPartFile, error) { | |||
| return &http2.IterMultiPartFile{ | |||
| FieldName: "files", | |||
| @@ -305,7 +309,7 @@ func (r *ObjectUpdateInfoResp) ParseResponse(resp *http.Response) error { | |||
| } | |||
| func (c *ObjectService) UpdateInfo(req ObjectUpdateInfo) (*ObjectUpdateInfoResp, error) { | |||
| return JSONAPI[*ObjectUpdateInfoResp](c.cfg, http.DefaultClient, &req) | |||
| return JSONAPI(c.cfg, http.DefaultClient, &req, &ObjectUpdateInfoResp{}) | |||
| } | |||
| const ObjectUpdateInfoByPathPath = "/object/updateInfoByPath" | |||
| @@ -328,7 +332,7 @@ func (r *ObjectUpdateInfoByPathResp) ParseResponse(resp *http.Response) error { | |||
| } | |||
| func (c *ObjectService) UpdateInfoByPath(req ObjectUpdateInfoByPath) (*ObjectUpdateInfoByPathResp, error) { | |||
| return JSONAPI[*ObjectUpdateInfoByPathResp](c.cfg, http.DefaultClient, &req) | |||
| return JSONAPI(c.cfg, http.DefaultClient, &req, &ObjectUpdateInfoByPathResp{}) | |||
| } | |||
| const ObjectMovePath = "/object/move" | |||
| @@ -362,7 +366,7 @@ func (r *ObjectMoveResp) ParseResponse(resp *http.Response) error { | |||
| } | |||
| func (c *ObjectService) Move(req ObjectMove) (*ObjectMoveResp, error) { | |||
| return JSONAPI[*ObjectMoveResp](c.cfg, http.DefaultClient, &req) | |||
| return JSONAPI(c.cfg, http.DefaultClient, &req, &ObjectMoveResp{}) | |||
| } | |||
| const ObjectDeletePath = "/object/delete" | |||
| @@ -383,7 +387,7 @@ func (r *ObjectDeleteResp) ParseResponse(resp *http.Response) error { | |||
| } | |||
| func (c *ObjectService) Delete(req ObjectDelete) error { | |||
| return JSONAPINoData[*ObjectDeleteResp](c.cfg, http.DefaultClient, &req) | |||
| return JSONAPINoData(c.cfg, http.DefaultClient, &req) | |||
| } | |||
| const ObjectDeleteByPathPath = "/object/deleteByPath" | |||
| @@ -405,7 +409,7 @@ func (r *ObjectDeleteByPathResp) ParseResponse(resp *http.Response) error { | |||
| } | |||
| func (c *ObjectService) DeleteByPath(req ObjectDeleteByPath) error { | |||
| return JSONAPINoData[*ObjectDeleteByPathResp](c.cfg, http.DefaultClient, &req) | |||
| return JSONAPINoData(c.cfg, http.DefaultClient, &req) | |||
| } | |||
| const ObjectClonePath = "/object/clone" | |||
| @@ -434,7 +438,7 @@ func (r *ObjectCloneResp) ParseResponse(resp *http.Response) error { | |||
| } | |||
| func (c *ObjectService) Clone(req ObjectClone) (*ObjectCloneResp, error) { | |||
| return JSONAPI[*ObjectCloneResp](c.cfg, http.DefaultClient, &req) | |||
| return JSONAPI(c.cfg, http.DefaultClient, &req, &ObjectCloneResp{}) | |||
| } | |||
| const ObjectGetPackageObjectsPath = "/object/getPackageObjects" | |||
| @@ -457,7 +461,7 @@ func (r *ObjectGetPackageObjectsResp) ParseResponse(resp *http.Response) error { | |||
| } | |||
| func (c *ObjectService) GetPackageObjects(req ObjectGetPackageObjects) (*ObjectGetPackageObjectsResp, error) { | |||
| return JSONAPI[*ObjectGetPackageObjectsResp](c.cfg, http.DefaultClient, &req) | |||
| return JSONAPI(c.cfg, http.DefaultClient, &req, &ObjectGetPackageObjectsResp{}) | |||
| } | |||
| const ObjectNewMultipartUploadPath = "/v1/object/newMultipartUpload" | |||
| @@ -481,7 +485,7 @@ func (r *ObjectNewMultipartUploadResp) ParseResponse(resp *http.Response) error | |||
| } | |||
| func (c *ObjectService) NewMultipartUpload(req ObjectNewMultipartUpload) (*ObjectNewMultipartUploadResp, error) { | |||
| return JSONAPI[*ObjectNewMultipartUploadResp](c.cfg, http.DefaultClient, &req) | |||
| return JSONAPI(c.cfg, http.DefaultClient, &req, &ObjectNewMultipartUploadResp{}) | |||
| } | |||
| const ObjectUploadPartPath = "/v1/object/uploadPart" | |||
| @@ -560,5 +564,5 @@ func (r *ObjectCompleteMultipartUploadResp) ParseResponse(resp *http.Response) e | |||
| } | |||
| func (c *ObjectService) CompleteMultipartUpload(req ObjectCompleteMultipartUpload) (*ObjectCompleteMultipartUploadResp, error) { | |||
| return JSONAPI[*ObjectCompleteMultipartUploadResp](c.cfg, http.DefaultClient, &req) | |||
| return JSONAPI(c.cfg, http.DefaultClient, &req, &ObjectCompleteMultipartUploadResp{}) | |||
| } | |||
| @@ -41,7 +41,7 @@ func (r *PackageGetResp) ParseResponse(resp *http.Response) error { | |||
| } | |||
| func (c *PackageService) Get(req PackageGetReq) (*PackageGetResp, error) { | |||
| return JSONAPI[*PackageGetResp](c.cfg, http.DefaultClient, &req) | |||
| return JSONAPI(c.cfg, http.DefaultClient, &req, &PackageGetResp{}) | |||
| } | |||
| const PackageGetByFullNamePath = "/package/getByFullName" | |||
| @@ -65,7 +65,7 @@ func (r *PackageGetByFullNameResp) ParseResponse(resp *http.Response) error { | |||
| } | |||
| func (c *PackageService) GetByName(req PackageGetByFullName) (*PackageGetByFullNameResp, error) { | |||
| return JSONAPI[*PackageGetByFullNameResp](c.cfg, http.DefaultClient, &req) | |||
| return JSONAPI(c.cfg, http.DefaultClient, &req, &PackageGetByFullNameResp{}) | |||
| } | |||
| const PackageCreatePath = "/package/create" | |||
| @@ -89,7 +89,7 @@ func (r *PackageCreateResp) ParseResponse(resp *http.Response) error { | |||
| } | |||
| func (s *PackageService) Create(req PackageCreate) (*PackageCreateResp, error) { | |||
| return JSONAPI[*PackageCreateResp](s.cfg, http.DefaultClient, &req) | |||
| return JSONAPI(s.cfg, http.DefaultClient, &req, &PackageCreateResp{}) | |||
| } | |||
| const PackageCreateLoadPath = "/package/createLoad" | |||
| @@ -164,7 +164,7 @@ func (r *PackageDeleteResp) ParseResponse(resp *http.Response) error { | |||
| } | |||
| func (c *PackageService) Delete(req PackageDelete) error { | |||
| return JSONAPINoData[*PackageDeleteResp](c.cfg, http.DefaultClient, &req) | |||
| return JSONAPINoData(c.cfg, http.DefaultClient, &req) | |||
| } | |||
| const PackageClonePath = "/package/clone" | |||
| @@ -189,7 +189,7 @@ func (r *PackageCloneResp) ParseResponse(resp *http.Response) error { | |||
| } | |||
| func (c *PackageService) Clone(req PackageClone) (*PackageCloneResp, error) { | |||
| return JSONAPI[*PackageCloneResp](c.cfg, http.DefaultClient, &req) | |||
| return JSONAPI(c.cfg, http.DefaultClient, &req, &PackageCloneResp{}) | |||
| } | |||
| const PackageListBucketPackagesPath = "/package/listBucketPackages" | |||
| @@ -212,7 +212,7 @@ func (r *PackageListBucketPackagesResp) ParseResponse(resp *http.Response) error | |||
| } | |||
| func (c *PackageService) ListBucketPackages(req PackageListBucketPackages) (*PackageListBucketPackagesResp, error) { | |||
| return JSONAPI[*PackageListBucketPackagesResp](c.cfg, http.DefaultClient, &req) | |||
| return JSONAPI(c.cfg, http.DefaultClient, &req, &PackageListBucketPackagesResp{}) | |||
| } | |||
| const PackageGetCachedStoragesPath = "/package/getCachedStorages" | |||
| @@ -235,5 +235,5 @@ func (r *PackageGetCachedStoragesResp) ParseResponse(resp *http.Response) error | |||
| } | |||
| func (c *PackageService) GetCachedStorages(req PackageGetCachedStoragesReq) (*PackageGetCachedStoragesResp, error) { | |||
| return JSONAPI[*PackageGetCachedStoragesResp](c.cfg, http.DefaultClient, &req) | |||
| return JSONAPI(c.cfg, http.DefaultClient, &req, &PackageGetCachedStoragesResp{}) | |||
| } | |||
| @@ -27,7 +27,7 @@ func (r *StorageLoadPackageResp) ParseResponse(resp *http.Response) error { | |||
| } | |||
| func (c *Client) StorageLoadPackage(req StorageLoadPackageReq) (*StorageLoadPackageResp, error) { | |||
| return JSONAPI[*StorageLoadPackageResp](c.cfg, http.DefaultClient, &req) | |||
| return JSONAPI(c.cfg, http.DefaultClient, &req, &StorageLoadPackageResp{}) | |||
| } | |||
| const StorageCreatePackagePath = "/storage/createPackage" | |||
| @@ -54,7 +54,7 @@ func (r *StorageCreatePackageResp) ParseResponse(resp *http.Response) error { | |||
| } | |||
| func (c *Client) StorageCreatePackage(req StorageCreatePackageReq) (*StorageCreatePackageResp, error) { | |||
| return JSONAPI[*StorageCreatePackageResp](c.cfg, http.DefaultClient, &req) | |||
| return JSONAPI(c.cfg, http.DefaultClient, &req, &StorageCreatePackageResp{}) | |||
| } | |||
| const StorageGetPath = "/storage/get" | |||
| @@ -77,5 +77,5 @@ func (r *StorageGetResp) ParseResponse(resp *http.Response) error { | |||
| } | |||
| func (c *Client) StorageGet(req StorageGet) (*StorageGetResp, error) { | |||
| return JSONAPI[*StorageGetResp](c.cfg, http.DefaultClient, &req) | |||
| return JSONAPI(c.cfg, http.DefaultClient, &req, &StorageGetResp{}) | |||
| } | |||
| @@ -26,7 +26,7 @@ func (r *UserCreateResp) ParseResponse(resp *http.Response) error { | |||
| } | |||
| func (c *Client) UserCreate(req *UserCreate) (*UserCreateResp, error) { | |||
| return JSONAPI[*UserCreateResp](c.cfg, http.DefaultClient, req) | |||
| return JSONAPI(c.cfg, http.DefaultClient, req, &UserCreateResp{}) | |||
| } | |||
| const UserDeletePath = "/v1/user/delete" | |||
| @@ -46,5 +46,5 @@ func (r *UserDeleteResp) ParseResponse(resp *http.Response) error { | |||
| } | |||
| func (c *Client) UserDelete(req *UserDelete) error { | |||
| return JSONAPINoData[*UserDeleteResp](c.cfg, http.DefaultClient, req) | |||
| return JSONAPINoData(c.cfg, http.DefaultClient, req) | |||
| } | |||
| @@ -44,33 +44,32 @@ func ParseJSONResponse[TBody any](resp *http.Response) (TBody, error) { | |||
| return ret, fmt.Errorf("unknow response content type: %s, status: %d, body(prefix): %s", contType, resp.StatusCode, strCont[:math2.Min(len(strCont), 200)]) | |||
| } | |||
| func JSONAPI[Resp sdks.APIResponse, Req sdks.APIRequest](cfg *Config, cli *http.Client, req Req) (Resp, error) { | |||
| var re Resp | |||
| func JSONAPI[Resp sdks.APIResponse, Req sdks.APIRequest](cfg *Config, cli *http.Client, req Req, resp Resp) (Resp, error) { | |||
| param := req.MakeParam() | |||
| httpReq, err := param.MakeRequest(cfg.URL) | |||
| if err != nil { | |||
| return re, err | |||
| return resp, err | |||
| } | |||
| if cfg.AccessKey != "" && cfg.SecretKey != "" { | |||
| err = SignWithPayloadHash(httpReq, cfg.AccessKey, cfg.SecretKey, calcSha256(param.Body)) | |||
| if err != nil { | |||
| return re, err | |||
| return resp, err | |||
| } | |||
| } | |||
| resp, err := cli.Do(httpReq) | |||
| httpResp, err := cli.Do(httpReq) | |||
| if err != nil { | |||
| return re, err | |||
| return resp, err | |||
| } | |||
| err = re.ParseResponse(resp) | |||
| return re, err | |||
| err = resp.ParseResponse(httpResp) | |||
| return resp, err | |||
| } | |||
| func JSONAPINoData[Resp sdks.APIResponse, Req sdks.APIRequest](cfg *Config, cli *http.Client, req Req) error { | |||
| func JSONAPINoData[Req sdks.APIRequest](cfg *Config, cli *http.Client, req Req) error { | |||
| param := req.MakeParam() | |||
| httpReq, err := param.MakeRequest(cfg.URL) | |||