Skip to content

Commit 1cc4970

Browse files
authored
Merge pull request #78 from agin719/common-dev
add GetBucketObjectVersions & update tips when failed
2 parents e4f0086 + bcc1ed2 commit 1cc4970

31 files changed

+945
-139
lines changed

bucket.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,3 +102,61 @@ type Bucket struct {
102102
Region string `xml:"Location,omitempty"`
103103
CreationDate string `xml:",omitempty"`
104104
}
105+
106+
type BucketGetObjectVersionsOptions struct {
107+
Prefix string `url:"prefix,omitempty"`
108+
Delimiter string `url:"delimiter,omitempty"`
109+
EncodingType string `url:"encoding-type,omitempty"`
110+
KeyMarker string `url:"key-marker,omitempty"`
111+
VersionIdMarker string `url:"version-id-marker,omitempty"`
112+
MaxKeys int `url:"max-keys,omitempty"`
113+
}
114+
115+
type BucketGetObjectVersionsResult struct {
116+
XMLName xml.Name `xml:"ListVersionsResult"`
117+
Name string `xml:"Name,omitempty"`
118+
EncodingType string `xml:"EncodingType,omitempty"`
119+
Prefix string `xml:"Prefix,omitempty"`
120+
KeyMarker string `xml:"KeyMarker,omitempty"`
121+
VersionIdMarker string `xml:"VersionIdMarker,omitempty"`
122+
MaxKeys int `xml:"MaxKeys,omitempty"`
123+
Delimiter string `xml:"Delimiter,omitempty"`
124+
IsTruncated bool `xml:"IsTruncated,omitempty"`
125+
NextKeyMarker string `xml:"NextKeyMarker,omitempty"`
126+
NextVersionIdMarker string `xml:"NextVersionIdMarker,omitempty"`
127+
CommonPrefixes []string `xml:"CommonPrefixes>Prefix,omitempty"`
128+
Version []ListVersionsResultVersion `xml:"Version,omitempty"`
129+
DeleteMarker []ListVersionsResultDeleteMarker `xml:"DeleteMarker,omitempty"`
130+
}
131+
132+
type ListVersionsResultVersion struct {
133+
Key string `xml:"Key,omitempty"`
134+
VersionId string `xml:"VersionId,omitempty"`
135+
IsLatest bool `xml:"IsLatest,omitempty"`
136+
LastModified string `xml:"LastModified,omitempty"`
137+
ETag string `xml:"ETag,omitempty"`
138+
Size int `xml:"Size,omitempty"`
139+
StorageClass string `xml:"StorageClass,omitempty"`
140+
Owner *Owner `xml:"Owner,omitempty"`
141+
}
142+
143+
type ListVersionsResultDeleteMarker struct {
144+
Key string `xml:"Key,omitempty"`
145+
VersionId string `xml:"VersionId,omitempty"`
146+
IsLatest bool `xml:"IsLatest,omitempty"`
147+
LastModified string `xml:"LastModified,omitempty"`
148+
Owner *Owner `xml:"Owner,omitempty"`
149+
}
150+
151+
func (s *BucketService) GetObjectVersions(ctx context.Context, opt *BucketGetObjectVersionsOptions) (*BucketGetObjectVersionsResult, *Response, error) {
152+
var res BucketGetObjectVersionsResult
153+
sendOpt := sendOptions{
154+
baseURL: s.client.BaseURL.BucketURL,
155+
uri: "/?versions",
156+
method: http.MethodGet,
157+
optQuery: opt,
158+
result: &res,
159+
}
160+
resp, err := s.client.send(ctx, &sendOpt)
161+
return &res, resp, err
162+
}

bucket_test.go

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,3 +150,108 @@ func TestBucketService_Head(t *testing.T) {
150150
t.Fatalf("Bucket.Head returned error: %v", err)
151151
}
152152
}
153+
154+
func TestBucketService_GetObjectVersions(t *testing.T) {
155+
setup()
156+
defer teardown()
157+
158+
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
159+
testMethod(t, r, http.MethodGet)
160+
w.WriteHeader(http.StatusOK)
161+
vs := values{
162+
"versions": "",
163+
"delimiter": "/",
164+
}
165+
testFormValues(t, r, vs)
166+
167+
fmt.Fprint(w, `<?xml version='1.0' encoding='utf-8' ?>
168+
<ListVersionsResult>
169+
<Name>examplebucket-1250000000</Name>
170+
<Prefix/>
171+
<KeyMarker/>
172+
<VersionIdMarker/>
173+
<MaxKeys>1000</MaxKeys>
174+
<IsTruncated>false</IsTruncated>
175+
<Delimiter>/</Delimiter>
176+
<CommonPrefixes>
177+
<Prefix>example-folder-1/</Prefix>
178+
</CommonPrefixes>
179+
<CommonPrefixes>
180+
<Prefix>example-folder-2/</Prefix>
181+
</CommonPrefixes>
182+
<Version>
183+
<Key>example-object-1.jpg</Key>
184+
<VersionId>MTg0NDUxNzgxMjEzNTU3NTk1Mjg</VersionId>
185+
<IsLatest>true</IsLatest>
186+
<LastModified>2019-08-16T10:45:53.000Z</LastModified>
187+
<ETag>&quot;5d1143df07a17b23320d0da161e2819e&quot;</ETag>
188+
<Size>30</Size>
189+
<StorageClass>STANDARD</StorageClass>
190+
<Owner>
191+
<ID>1250000000</ID>
192+
<DisplayName>1250000000</DisplayName>
193+
</Owner>
194+
</Version>
195+
<DeleteMarker>
196+
<Key>example-object-1.jpg</Key>
197+
<VersionId>MTg0NDUxNzgxMjEzNjE1OTcxMzM</VersionId>
198+
<IsLatest>false</IsLatest>
199+
<LastModified>2019-08-16T10:45:47.000Z</LastModified>
200+
<Owner>
201+
<ID>1250000000</ID>
202+
<DisplayName>1250000000</DisplayName>
203+
</Owner>
204+
</DeleteMarker>
205+
</ListVersionsResult>`)
206+
})
207+
208+
want := &BucketGetObjectVersionsResult {
209+
XMLName: xml.Name { Local: "ListVersionsResult" },
210+
Name: "examplebucket-1250000000",
211+
MaxKeys: 1000,
212+
IsTruncated: false,
213+
Delimiter: "/",
214+
CommonPrefixes: []string {
215+
"example-folder-1/",
216+
"example-folder-2/",
217+
},
218+
Version: []ListVersionsResultVersion {
219+
{
220+
Key: "example-object-1.jpg",
221+
VersionId: "MTg0NDUxNzgxMjEzNTU3NTk1Mjg",
222+
IsLatest: true,
223+
LastModified: "2019-08-16T10:45:53.000Z",
224+
ETag: "\"5d1143df07a17b23320d0da161e2819e\"",
225+
Size: 30,
226+
StorageClass: "STANDARD",
227+
Owner: &Owner {
228+
ID: "1250000000",
229+
DisplayName: "1250000000",
230+
},
231+
},
232+
},
233+
DeleteMarker: []ListVersionsResultDeleteMarker {
234+
{
235+
Key: "example-object-1.jpg",
236+
VersionId: "MTg0NDUxNzgxMjEzNjE1OTcxMzM",
237+
IsLatest: false,
238+
LastModified: "2019-08-16T10:45:47.000Z",
239+
Owner: &Owner {
240+
ID: "1250000000",
241+
DisplayName: "1250000000",
242+
},
243+
},
244+
},
245+
}
246+
opt := &BucketGetObjectVersionsOptions {
247+
Delimiter: "/",
248+
}
249+
res, _, err := client.Bucket.GetObjectVersions(context.Background(), opt)
250+
if err != nil {
251+
t.Fatalf("Bucket.GetObjectVersions returned error: %v", err)
252+
}
253+
if !reflect.DeepEqual(res, want) {
254+
t.Errorf("Bucket.GetObjectVersions returned\n%+v\nwant\n%+v", res, want)
255+
}
256+
257+
}

cos.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import (
2121

2222
const (
2323
// Version current go sdk version
24-
Version = "0.7.5"
24+
Version = "0.7.6"
2525
userAgent = "cos-go-sdk-v5/" + Version
2626
contentTypeXML = "application/xml"
2727
defaultServiceBaseURL = "http://service.cos.myqcloud.com"

costesting/ci_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,15 @@ func (s *CosTestSuite) TestGetBucket() {
184184
assert.Nil(s.T(), err, "GetBucket Failed")
185185
}
186186

187+
func (s *CosTestSuite) TestGetObjectVersions() {
188+
opt := &cos.BucketGetObjectVersionsOptions {
189+
Prefix: "中文",
190+
MaxKeys: 3,
191+
}
192+
_, _, err := s.Client.Bucket.GetObjectVersions(context.Background(), opt)
193+
assert.Nil(s.T(), err, "GetObjectVersions Failed")
194+
}
195+
187196
func (s *CosTestSuite) TestGetBucketLocation() {
188197
v, _, err := s.Client.Bucket.GetLocation(context.Background())
189198
assert.Nil(s.T(), err, "GetLocation Failed")

example/bucket/getLogging.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"net/url"
7+
"os"
8+
9+
"net/http"
10+
11+
"github.com/tencentyun/cos-go-sdk-v5"
12+
"github.com/tencentyun/cos-go-sdk-v5/debug"
13+
)
14+
15+
func main() {
16+
u, _ := url.Parse("https://bj-1259654469.cos.ap-beijing.myqcloud.com")
17+
b := &cos.BaseURL{
18+
BucketURL: u,
19+
}
20+
c := cos.NewClient(b, &http.Client{
21+
Transport: &cos.AuthorizationTransport{
22+
SecretID: os.Getenv("COS_SECRETID"),
23+
SecretKey: os.Getenv("COS_SECRETKEY"),
24+
Transport: &debug.DebugRequestTransport{
25+
RequestHeader: true,
26+
RequestBody: true,
27+
ResponseHeader: true,
28+
ResponseBody: true,
29+
},
30+
},
31+
})
32+
33+
v, _, err := c.Bucket.GetLogging(context.Background())
34+
if err != nil {
35+
panic(err)
36+
}
37+
fmt.Printf("%+v\n", v.LoggingEnabled)
38+
}

example/bucket/getObjectVersion.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"os"
7+
8+
"net/url"
9+
10+
"net/http"
11+
12+
"github.com/tencentyun/cos-go-sdk-v5"
13+
"github.com/tencentyun/cos-go-sdk-v5/debug"
14+
)
15+
16+
func log_status(err error) {
17+
if err == nil {
18+
return
19+
}
20+
if cos.IsNotFoundError(err) {
21+
// WARN
22+
fmt.Println("WARN: Resource is not existed")
23+
} else if e, ok := cos.IsCOSError(err); ok {
24+
fmt.Printf("ERROR: Code: %v\n", e.Code)
25+
fmt.Printf("ERROR: Message: %v\n", e.Message)
26+
fmt.Printf("ERROR: Resource: %v\n", e.Resource)
27+
fmt.Printf("ERROR: RequestId: %v\n", e.RequestID)
28+
// ERROR
29+
} else {
30+
fmt.Printf("ERROR: %v\n", err)
31+
// ERROR
32+
}
33+
}
34+
35+
func main() {
36+
u, _ := url.Parse("https://test-1259654469.cos.ap-guangzhou.myqcloud.com")
37+
b := &cos.BaseURL{
38+
BucketURL: u,
39+
}
40+
c := cos.NewClient(b, &http.Client{
41+
Transport: &cos.AuthorizationTransport{
42+
SecretID: os.Getenv("COS_SECRETID"),
43+
SecretKey: os.Getenv("COS_SECRETKEY"),
44+
Transport: &debug.DebugRequestTransport{
45+
RequestHeader: true,
46+
RequestBody: true,
47+
ResponseHeader: true,
48+
ResponseBody: true,
49+
},
50+
},
51+
})
52+
53+
opt := &cos.BucketGetObjectVersionsOptions {
54+
Delimiter: "/",
55+
MaxKeys: 1,
56+
}
57+
v, _, err := c.Bucket.GetObjectVersions(context.Background(), opt)
58+
log_status(err)
59+
60+
for _, c := range v.Version {
61+
fmt.Printf("%v, %v, %v\n", c.Key, c.Size, c.IsLatest)
62+
}
63+
64+
}

example/object/MutiUpload.go renamed to example/object/MultiUpload.go

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,25 @@ import (
1212
"github.com/tencentyun/cos-go-sdk-v5/debug"
1313
)
1414

15+
func log_status(err error) {
16+
if err == nil {
17+
return
18+
}
19+
if cos.IsNotFoundError(err) {
20+
// WARN
21+
fmt.Println("WARN: Resource is not existed")
22+
} else if e, ok := cos.IsCOSError(err); ok {
23+
fmt.Printf("ERROR: Code: %v\n", e.Code)
24+
fmt.Printf("ERROR: Message: %v\n", e.Message)
25+
fmt.Printf("ERROR: Resource: %v\n", e.Resource)
26+
fmt.Printf("ERROR: RequestId: %v\n", e.RequestID)
27+
// ERROR
28+
} else {
29+
fmt.Printf("ERROR: %v\n", err)
30+
// ERROR
31+
}
32+
}
33+
1534
func main() {
1635
u, _ := url.Parse("http://alanbj-1251668577.cos.ap-beijing.myqcloud.com")
1736
b := &cos.BaseURL{BucketURL: u}
@@ -37,8 +56,6 @@ func main() {
3756
v, _, err := c.Object.MultiUpload(
3857
context.Background(), "test/gomulput1G", "./test1G", opt,
3958
)
40-
if err != nil {
41-
panic(err)
42-
}
59+
log_status(err)
4360
fmt.Println(v)
4461
}

example/object/abortMultipartUpload.go

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,25 @@ import (
1212
"github.com/tencentyun/cos-go-sdk-v5/debug"
1313
)
1414

15+
func log_status(err error) {
16+
if err == nil {
17+
return
18+
}
19+
if cos.IsNotFoundError(err) {
20+
// WARN
21+
fmt.Println("WARN: Resource is not existed")
22+
} else if e, ok := cos.IsCOSError(err); ok {
23+
fmt.Printf("ERROR: Code: %v\n", e.Code)
24+
fmt.Printf("ERROR: Message: %v\n", e.Message)
25+
fmt.Printf("ERROR: Resource: %v\n", e.Resource)
26+
fmt.Printf("ERROR: RequestId: %v\n", e.RequestID)
27+
// ERROR
28+
} else {
29+
fmt.Printf("ERROR: %v\n", err)
30+
// ERROR
31+
}
32+
}
33+
1534
func main() {
1635
u, _ := url.Parse("https://test-1253846586.cos.ap-guangzhou.myqcloud.com")
1736
b := &cos.BaseURL{BucketURL: u}
@@ -30,14 +49,10 @@ func main() {
3049

3150
name := "test_multipart.txt"
3251
v, _, err := c.Object.InitiateMultipartUpload(context.Background(), name, nil)
33-
if err != nil {
34-
panic(err)
35-
}
52+
log_status(err)
3653
fmt.Printf("%s\n", v.UploadID)
3754

3855
resp, err := c.Object.AbortMultipartUpload(context.Background(), name, v.UploadID)
39-
if err != nil {
40-
panic(err)
41-
}
56+
log_status(err)
4257
fmt.Printf("%s\n", resp.Status)
4358
}

0 commit comments

Comments
 (0)