diff --git a/cos.go b/cos.go index bf3a318..f2ba435 100644 --- a/cos.go +++ b/cos.go @@ -26,7 +26,7 @@ import ( const ( // Version current go sdk version - Version = "0.7.56" + Version = "0.7.57" UserAgent = "cos-go-sdk-v5/" + Version contentTypeXML = "application/xml" defaultServiceBaseURL = "http://service.cos.myqcloud.com" @@ -96,7 +96,9 @@ func (*BaseURL) innerCheck(u *url.URL, reg *regexp.Regexp) bool { } func (u *BaseURL) Check() bool { - return u.innerCheck(u.BucketURL, bucketDomainChecker) && u.innerCheck(u.ServiceURL, serviceDomainChecker) && u.innerCheck(u.BatchURL, batchDomainChecker) + return u.innerCheck(u.BucketURL, bucketDomainChecker) && + (u.innerCheck(u.ServiceURL, serviceDomainChecker) || u.innerCheck(u.ServiceURL, bucketDomainChecker)) && + (u.innerCheck(u.BatchURL, batchDomainChecker) || u.innerCheck(u.BatchURL, bucketDomainChecker)) } // NewBucketURL 生成 BaseURL 所需的 BucketURL diff --git a/cos_test.go b/cos_test.go index 52d3f8d..293be84 100644 --- a/cos_test.go +++ b/cos_test.go @@ -247,52 +247,52 @@ func Test_CheckRetrieable(t *testing.T) { func Test_BaseURL(t *testing.T) { u, _ := url.Parse("https://example-125000000.cos.ap-chengdu.myqcloud.com") - if !(&BaseURL{BucketURL: u}).Check() { + if !(&BaseURL{BucketURL: u, ServiceURL: u, BatchURL: u}).Check() { t.Errorf("BaseURL check failed: %v", u) } u, _ = url.Parse("https://example-125000000.cos-website.ap-chengdu.myqcloud.com") - if !(&BaseURL{BucketURL: u}).Check() { + if !(&BaseURL{BucketURL: u, ServiceURL: u, BatchURL: u}).Check() { t.Errorf("BaseURL check failed: %v", u) } u, _ = url.Parse("https://example-125000000.cos-internal.ap-chengdu.tencentcos.cn") - if !(&BaseURL{BucketURL: u}).Check() { + if !(&BaseURL{BucketURL: u, ServiceURL: u, BatchURL: u}).Check() { t.Errorf("BaseURL check failed: %v", u) } u, _ = url.Parse("https://example-125000000.cos.ap-chengdu.tencentcos.cn") - if !(&BaseURL{BucketURL: u}).Check() { + if !(&BaseURL{BucketURL: u, ServiceURL: u, BatchURL: u}).Check() { t.Errorf("BaseURL check failed: %v", u) } u, _ = url.Parse("https://example-125000000.cos.accelerate.myqcloud.com") - if !(&BaseURL{BucketURL: u}).Check() { + if !(&BaseURL{BucketURL: u, ServiceURL: u, BatchURL: u}).Check() { t.Errorf("BaseURL check failed: %v", u) } u, _ = url.Parse("https://example-125000000.cos-internal.accelerate.tencentcos.cn") - if !(&BaseURL{BucketURL: u}).Check() { + if !(&BaseURL{BucketURL: u, ServiceURL: u, BatchURL: u}).Check() { t.Errorf("BaseURL check failed: %v", u) } u, _ = url.Parse("http://example-125000000.cos.ap-chengdu.myqcloud.com:8080") - if !(&BaseURL{BucketURL: u}).Check() { + if !(&BaseURL{BucketURL: u, ServiceURL: u, BatchURL: u}).Check() { t.Errorf("BaseURL check failed: %v", u) } u, _ = url.Parse("http://example-125000000.cos-internal.ap-chengdu.tencentcos.cn:80") - if !(&BaseURL{BucketURL: u}).Check() { + if !(&BaseURL{BucketURL: u, ServiceURL: u, BatchURL: u}).Check() { t.Errorf("BaseURL check failed: %v", u) } u, _ = url.Parse("https://example-125000000.cos-internal.accelerate.tencentcos.cn:443") - if !(&BaseURL{BucketURL: u}).Check() { + if !(&BaseURL{BucketURL: u, ServiceURL: u, BatchURL: u}).Check() { t.Errorf("BaseURL check failed: %v", u) } u, _ = url.Parse("https://example-125000000.cos.ap-chengdu@123.com/.myqcloud.com") - if (&BaseURL{BucketURL: u}).Check() { + if (&BaseURL{BucketURL: u, ServiceURL: u, BatchURL: u}).Check() { t.Errorf("BaseURL check failed: %v", u) } u, _ = url.Parse("https://example-125000000.cos.ap-chengdu@123.com/.myqcloud.com:443") - if (&BaseURL{BucketURL: u}).Check() { + if (&BaseURL{BucketURL: u, ServiceURL: u, BatchURL: u}).Check() { t.Errorf("BaseURL check failed: %v", u) } u, _ = url.Parse("https://example-125000000.cos.ap-chengdu@123.com/myqcloud.com") - if (&BaseURL{BucketURL: u}).Check() { + if (&BaseURL{BucketURL: u, ServiceURL: u, BatchURL: u}).Check() { t.Errorf("BaseURL check failed: %v", u) } diff --git a/object.go b/object.go index 368782d..dae557d 100644 --- a/object.go +++ b/object.go @@ -118,10 +118,11 @@ func (s *ObjectService) GetObjectURL(name string) *url.URL { } type PresignedURLOptions struct { - Query *url.Values `xml:"-" url:"-" header:"-"` - Header *http.Header `header:"-,omitempty" url:"-" xml:"-"` - SignMerged bool `xml:"-" url:"-" header:"-"` - AuthTime *AuthTime `xml:"-" url:"-" header:"-"` + Query *url.Values `xml:"-" url:"-" header:"-"` + Header *http.Header `header:"-,omitempty" url:"-" xml:"-"` + SignMerged bool `xml:"-" url:"-" header:"-"` + AuthTime *AuthTime `xml:"-" url:"-" header:"-"` + EncodeDelimiter bool `xml:"-" url:"-" header:"-"` } // GetPresignedURL get the object presigned to down or upload file by url @@ -282,7 +283,17 @@ func (s *ObjectService) GetPresignedURL3(ctx context.Context, httpMethod, name s if name == "" { return nil, fmt.Errorf("object key is empty.") } - name = encodeURIComponent(name, []byte("/")) + var encodeDelimiter bool + if opt != nil { + if popt, ok := opt.(*PresignedURLOptions); ok { + encodeDelimiter = popt.EncodeDelimiter + } + } + if encodeDelimiter { + name = encodeURIComponent(name) + } else { + name = encodeURIComponent(name, []byte("/")) + } cred := s.client.GetCredential() if cred == nil { diff --git a/object_test.go b/object_test.go index 9db3f08..9ab9684 100644 --- a/object_test.go +++ b/object_test.go @@ -452,6 +452,7 @@ func TestObjectService_GetPresignedURL3(t *testing.T) { t.Fatalf("Wrong PreSignedURL!") } + opt1.EncodeDelimiter = true _, err = client.Object.GetPresignedURL3(c, http.MethodPut, "", time.Hour, opt1) if err == nil { t.Errorf("GetPresignedURL expect err is not null")