Skip to content

Commit

Permalink
support bucket cname api.
Browse files Browse the repository at this point in the history
  • Loading branch information
huiguangjun authored and kkuai committed May 25, 2022
1 parent c82fb81 commit 6468ccd
Show file tree
Hide file tree
Showing 3 changed files with 164 additions and 2 deletions.
123 changes: 123 additions & 0 deletions oss/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -1868,6 +1868,129 @@ func (client Client) GetBucketCname(bucketName string, options ...Option) (strin
return string(data), err
}

// CreateBucketCnameToken create a token for the cname.
// bucketName the bucket name.
// cname a custom domain name.
// error it's nil if no error, otherwise it's an error object.
func (client Client) CreateBucketCnameToken(bucketName string, cname string, options ...Option) (CreateBucketCnameTokenResult, error) {
var out CreateBucketCnameTokenResult
params := map[string]interface{}{}
params["cname"] = nil
params["comp"] = "token"

rxml := CnameConfigurationXML{}
rxml.Domain = cname

bs, err := xml.Marshal(rxml)
if err != nil {
return out, err
}
buffer := new(bytes.Buffer)
buffer.Write(bs)

contentType := http.DetectContentType(buffer.Bytes())
headers := map[string]string{}
headers[HTTPHeaderContentType] = contentType

resp, err := client.do("POST", bucketName, params, headers, buffer, options...)
if err != nil {
return out, err
}
defer resp.Body.Close()

err = xmlUnmarshal(resp.Body, &out)
return out, err
}

// GetBucketCnameToken get a token for the cname
// bucketName the bucket name.
// cname a custom domain name.
// error it's nil if no error, otherwise it's an error object.
func (client Client) GetBucketCnameToken(bucketName string, cname string, options ...Option) (GetBucketCnameTokenResult, error) {
var out GetBucketCnameTokenResult
params := map[string]interface{}{}
params["cname"] = cname
params["comp"] = "token"

resp, err := client.do("GET", bucketName, params, nil, nil, options...)
if err != nil {
return out, err
}
defer resp.Body.Close()

err = xmlUnmarshal(resp.Body, &out)
return out, err
}

// PutBucketCname map a custom domain name to a bucket
// bucketName the bucket name.
// xmlBody the cname configuration in xml foramt
// error it's nil if no error, otherwise it's an error object.
func (client Client) PutBucketCnameXml(bucketName string, xmlBody string, options ...Option) error {
params := map[string]interface{}{}
params["cname"] = nil
params["comp"] = "add"

buffer := new(bytes.Buffer)
buffer.Write([]byte(xmlBody))
contentType := http.DetectContentType(buffer.Bytes())
headers := map[string]string{}
headers[HTTPHeaderContentType] = contentType

resp, err := client.do("POST", bucketName, params, headers, buffer, options...)
if err != nil {
return err
}
defer resp.Body.Close()
return CheckRespCode(resp.StatusCode, []int{http.StatusOK})
}

// PutBucketCname map a custom domain name to a bucket
// bucketName the bucket name.
// cname a custom domain name.
// error it's nil if no error, otherwise it's an error object.
func (client Client) PutBucketCname(bucketName string, cname string, options ...Option) error {
rxml := CnameConfigurationXML{}
rxml.Domain = cname

bs, err := xml.Marshal(rxml)
if err != nil {
return err
}
return client.PutBucketCnameXml(bucketName, string(bs), options...)
}

// DeleteBucketCname remove the mapping of the custom domain name from a bucket.
// bucketName the bucket name.
// cname a custom domain name.
// error it's nil if no error, otherwise it's an error object.
func (client Client) DeleteBucketCname(bucketName string, cname string, options ...Option) error {
params := map[string]interface{}{}
params["cname"] = nil
params["comp"] = "delete"

rxml := CnameConfigurationXML{}
rxml.Domain = cname

bs, err := xml.Marshal(rxml)
if err != nil {
return err
}
buffer := new(bytes.Buffer)
buffer.Write(bs)

contentType := http.DetectContentType(buffer.Bytes())
headers := map[string]string{}
headers[HTTPHeaderContentType] = contentType

resp, err := client.do("POST", bucketName, params, headers, buffer, options...)
if err != nil {
return err
}
defer resp.Body.Close()
return CheckRespCode(resp.StatusCode, []int{http.StatusOK})
}

// LimitUploadSpeed set upload bandwidth limit speed,default is 0,unlimited
// upSpeed KB/s, 0 is unlimited,default is 0
// error it's nil if success, otherwise failure
Expand Down
22 changes: 20 additions & 2 deletions oss/client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4526,19 +4526,37 @@ func (s *OssClientSuite) TestBucketReplicationGetProgressWithEmptyRuleID(c *C) {
c.Assert(err, IsNil)
}

func (s *OssClientSuite) TestGetBucketCName(c *C) {
func (s *OssClientSuite) TestBucketCName(c *C) {
client, err := New(endpoint, accessID, accessKey)
c.Assert(err, IsNil)

bucketName := bucketNamePrefix + RandLowStr(5)
err = client.CreateBucket(bucketName)
c.Assert(err, IsNil)

cbResult, err := client.CreateBucketCnameToken(bucketName, "www.example.com")
c.Assert(err, IsNil)
c.Assert(cbResult.Bucket, Equals, bucketName)
c.Assert(cbResult.Cname, Equals, "www.example.com")

gbResult, err := client.GetBucketCnameToken(bucketName, "www.example.com")
c.Assert(err, IsNil)
c.Assert(gbResult.Bucket, Equals, bucketName)
c.Assert(gbResult.Cname, Equals, "www.example.com")

err = client.PutBucketCname(bucketName, "www.example.com")
serviceErr, isSuc := err.(ServiceError)
c.Assert(isSuc, Equals, true)
c.Assert(serviceErr.Code, Equals, "NeedVerifyDomainOwnership")

xmlBody, err := client.GetBucketCname(bucketName)
c.Assert(err, IsNil)
c.Assert(strings.Contains(xmlBody, bucketName), Equals, true)

err = client.DeleteBucket(bucketName)
err = client.DeleteBucketCname(bucketName, "www.example.com")
c.Assert(err, IsNil)

client.DeleteBucket(bucketName)
c.Assert(err, IsNil)
}

Expand Down
21 changes: 21 additions & 0 deletions oss/type.go
Original file line number Diff line number Diff line change
Expand Up @@ -1283,3 +1283,24 @@ type ReplicationXML struct {
XMLName xml.Name `xml:"ReplicationRules"`
ID string `xml:"ID,omitempty"`
}

// CnameConfigurationXML define cname configuration
type CnameConfigurationXML struct {
XMLName xml.Name `xml:"BucketCnameConfiguration"`
Domain string `xml:"Cname>Domain"`
}

// CnameTokenXML define cname token information
type CnameTokenXML struct {
XMLName xml.Name `xml:"CnameToken"`
Bucket string `xml:"Bucket,omitempty"`
Cname string `xml:"Cname,omitempty"`
Token string `xml:"Token,omitempty"`
ExpireTime string `xml:"ExpireTime,omitempty"`
}

// CreateBucketCnameTokenResult defines result object for CreateBucketCnameToken request
type CreateBucketCnameTokenResult CnameTokenXML

// GetBucketCnameTokenResult defines result object for GetBucketCnameToken request
type GetBucketCnameTokenResult CnameTokenXML

0 comments on commit 6468ccd

Please sign in to comment.