Files
waf-platform/EdgeNode/internal/oss/provider_tencent_cos.go
2026-02-04 20:27:13 +08:00

119 lines
2.7 KiB
Go

// 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
}