// Copyright 2023 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn . //go:build plus package oss import ( "context" "errors" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/ossconfigs" "github.com/tencentyun/cos-go-sdk-v5" "net/http" "net/url" ) type TencentCOSProvider struct { client *cos.Client } func NewTencentCOSProvider() ProviderInterface { return &TencentCOSProvider{} } func (this *TencentCOSProvider) Init(options ossconfigs.OSSOptions, bucketName string) error { realOptions, ok := options.(*ossconfigs.TencentCOSProviderOptions) if !ok { return errors.New("invalid options for 'TencentCOSProvider'") } // TODO 将此URL组织方式放入到集群设置--对象存储策略中 bucketURL, err := url.Parse("https://" + bucketName + ".cos." + realOptions.Region + ".myqcloud.com") if err != nil { return err } serviceURL, err := url.Parse("https://cos." + realOptions.Region + ".myqcloud.com") if err != nil { return err } var baseURL = &cos.BaseURL{ BucketURL: bucketURL, ServiceURL: serviceURL, } this.client = cos.NewClient(baseURL, &http.Client{ Transport: &cos.AuthorizationTransport{ SecretID: realOptions.SecretId, SecretKey: realOptions.SecretKey, }, }) return nil } func (this *TencentCOSProvider) Head(key string) (httpResponse *http.Response, nativeErrCode string, err error) { resp, respErr := this.client.Object.Head(context.Background(), key, &cos.ObjectHeadOptions{}) if respErr != nil { nativeErrCode, err = this.parseErr(respErr) return } httpResponse = resp.Response return } func (this *TencentCOSProvider) Get(key string) (httpResponse *http.Response, nativeErrCode string, err error) { resp, respErr := this.client.Object.Get(context.Background(), key, &cos.ObjectGetOptions{}) if respErr != nil { nativeErrCode, err = this.parseErr(respErr) return } httpResponse = resp.Response return } func (this *TencentCOSProvider) GetRange(key string, bytesRange string) (httpResponse *http.Response, nativeErrCode string, err error) { resp, respErr := this.client.Object.Get(context.Background(), key, &cos.ObjectGetOptions{ Range: bytesRange, }) if respErr != nil { nativeErrCode, err = this.parseErr(respErr) return } httpResponse = resp.Response return } func (this *TencentCOSProvider) parseErr(err error) (errCode string, resultErr error) { if err == nil { return } resultErr = err respErr, ok := err.(*cos.ErrorResponse) if ok { errCode = respErr.Code } // 特殊错误 if errCode == "NoSuchBucket" { resultErr = errNoBucket return } if cos.IsNotFoundError(err) { resultErr = errNotFound return } if errCode == "RequestTimeout" { resultErr = errRequestTimeout return } return }