committed by
							
								
								GitHub
							
						
					
				
				
				  
				  No known key found for this signature in database
				  
				  	
						GPG Key ID: 4AEE18F83AFDEB23
				  	
				  
				
			
		
		
		
	
				 27 changed files with 2021 additions and 449 deletions
			
			
		- 
					17auth.go
 - 
					7batch.go
 - 
					17bucket.go
 - 
					9bucket_origin.go
 - 
					180bucket_origin_test.go
 - 
					121bucket_policy_test.go
 - 
					241ci.go
 - 
					7ci_doc.go
 - 
					497ci_test.go
 - 
					33error_test.go
 - 
					89example/CI/ci_QRcode.go
 - 
					15example/CI/ci_get.go
 - 
					99example/CI/ci_watermark.go
 - 
					28example/CI/compression/ci_compression.go
 - 
					68example/CI/compression/guetzli.go
 - 
					16example/CI/content_auditing/ci_audio_auditing_job.go
 - 
					7example/CI/content_auditing/ci_image_recognition.go
 - 
					2example/bucket/putPolicy.go
 - 
					132example/object/ci_doc_process.go
 - 
					32example/object/directory.go
 - 
					124object.go
 - 
					1object_part.go
 - 
					260object_test.go
 
@ -0,0 +1,180 @@ | 
				
			|||
package cos | 
				
			|||
 | 
				
			|||
import ( | 
				
			|||
	"context" | 
				
			|||
	"encoding/xml" | 
				
			|||
	"fmt" | 
				
			|||
	"net/http" | 
				
			|||
	"reflect" | 
				
			|||
	"testing" | 
				
			|||
) | 
				
			|||
 | 
				
			|||
func TestBucketService_GetOrigin(t *testing.T) { | 
				
			|||
	setup() | 
				
			|||
	defer teardown() | 
				
			|||
 | 
				
			|||
	mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { | 
				
			|||
		testMethod(t, r, "GET") | 
				
			|||
		vs := values{ | 
				
			|||
			"origin": "", | 
				
			|||
		} | 
				
			|||
		testFormValues(t, r, vs) | 
				
			|||
		fmt.Fprint(w, `<OriginConfiguration> | 
				
			|||
        <OriginRule> | 
				
			|||
            <RulePriority>1</RulePriority> | 
				
			|||
            <OriginType>Mirror</OriginType> | 
				
			|||
            <OriginCondition> | 
				
			|||
                <HTTPStatusCode>404</HTTPStatusCode> | 
				
			|||
                <Prefix></Prefix> | 
				
			|||
            </OriginCondition> | 
				
			|||
            <OriginParameter> | 
				
			|||
                <Protocol>HTTP</Protocol> | 
				
			|||
                <FollowQueryString>true</FollowQueryString> | 
				
			|||
                <HttpHeader> | 
				
			|||
                    <NewHttpHeaders> | 
				
			|||
                        <Header> | 
				
			|||
                            <Key>x-cos</Key> | 
				
			|||
                            <Value>exampleHeader</Value> | 
				
			|||
                        </Header> | 
				
			|||
                    </NewHttpHeaders> | 
				
			|||
                    <FollowHttpHeaders> | 
				
			|||
                        <Header> | 
				
			|||
                            <Key>exampleHeaderKey</Key> | 
				
			|||
                        </Header> | 
				
			|||
                    </FollowHttpHeaders> | 
				
			|||
                </HttpHeader> | 
				
			|||
                <FollowRedirection>true</FollowRedirection> | 
				
			|||
                <HttpRedirectCode>302</HttpRedirectCode> | 
				
			|||
            </OriginParameter> | 
				
			|||
            <OriginInfo> | 
				
			|||
                <HostInfo> | 
				
			|||
                    <HostName>examplebucket-1250000000.cos.ap-shanghai.myqcloud.com</HostName> | 
				
			|||
                </HostInfo> | 
				
			|||
            </OriginInfo> | 
				
			|||
        </OriginRule> | 
				
			|||
        </OriginConfiguration> | 
				
			|||
        `) | 
				
			|||
	}) | 
				
			|||
 | 
				
			|||
	res, _, err := client.Bucket.GetOrigin(context.Background()) | 
				
			|||
	if err != nil { | 
				
			|||
		t.Fatalf("Bucket.GetOrigin returned error %v", err) | 
				
			|||
	} | 
				
			|||
 | 
				
			|||
	want := &BucketGetOriginResult{ | 
				
			|||
		XMLName: xml.Name{Local: "OriginConfiguration"}, | 
				
			|||
		Rule: []BucketOriginRule{ | 
				
			|||
			{ | 
				
			|||
				OriginType:   "Mirror", | 
				
			|||
				RulePriority: 1, | 
				
			|||
				OriginCondition: &BucketOriginCondition{ | 
				
			|||
					HTTPStatusCode: "404", | 
				
			|||
				}, | 
				
			|||
				OriginParameter: &BucketOriginParameter{ | 
				
			|||
					Protocol:          "HTTP", | 
				
			|||
					FollowQueryString: true, | 
				
			|||
					HttpHeader: &BucketOriginHttpHeader{ | 
				
			|||
						FollowHttpHeaders: []OriginHttpHeader{ | 
				
			|||
							{ | 
				
			|||
								Key: "exampleHeaderKey", | 
				
			|||
							}, | 
				
			|||
						}, | 
				
			|||
						NewHttpHeaders: []OriginHttpHeader{ | 
				
			|||
							{ | 
				
			|||
								Key:   "x-cos", | 
				
			|||
								Value: "exampleHeader", | 
				
			|||
							}, | 
				
			|||
						}, | 
				
			|||
					}, | 
				
			|||
					FollowRedirection: true, | 
				
			|||
					HttpRedirectCode:  "302", | 
				
			|||
				}, | 
				
			|||
				OriginInfo: &BucketOriginInfo{ | 
				
			|||
					HostInfo: "examplebucket-1250000000.cos.ap-shanghai.myqcloud.com", | 
				
			|||
				}, | 
				
			|||
			}, | 
				
			|||
		}, | 
				
			|||
	} | 
				
			|||
 | 
				
			|||
	if !reflect.DeepEqual(res, want) { | 
				
			|||
		t.Errorf("Bucket.GetOrigin returned %+v, want %+v", res, want) | 
				
			|||
	} | 
				
			|||
} | 
				
			|||
 | 
				
			|||
func TestBucketService_PutOrigin(t *testing.T) { | 
				
			|||
	setup() | 
				
			|||
	defer teardown() | 
				
			|||
 | 
				
			|||
	opt := &BucketPutOriginOptions{ | 
				
			|||
		XMLName: xml.Name{Local: "OriginConfiguration"}, | 
				
			|||
		Rule: []BucketOriginRule{ | 
				
			|||
			{ | 
				
			|||
				OriginType:   "Mirror", | 
				
			|||
				RulePriority: 1, | 
				
			|||
				OriginCondition: &BucketOriginCondition{ | 
				
			|||
					HTTPStatusCode: "404", | 
				
			|||
				}, | 
				
			|||
				OriginParameter: &BucketOriginParameter{ | 
				
			|||
					Protocol:          "HTTP", | 
				
			|||
					FollowQueryString: true, | 
				
			|||
					HttpHeader: &BucketOriginHttpHeader{ | 
				
			|||
						FollowHttpHeaders: []OriginHttpHeader{ | 
				
			|||
							{ | 
				
			|||
								Key: "exampleHeaderKey", | 
				
			|||
							}, | 
				
			|||
						}, | 
				
			|||
						NewHttpHeaders: []OriginHttpHeader{ | 
				
			|||
							{ | 
				
			|||
								Key:   "x-cos", | 
				
			|||
								Value: "exampleHeader", | 
				
			|||
							}, | 
				
			|||
						}, | 
				
			|||
					}, | 
				
			|||
					FollowRedirection: true, | 
				
			|||
					HttpRedirectCode:  "302", | 
				
			|||
				}, | 
				
			|||
				OriginInfo: &BucketOriginInfo{ | 
				
			|||
					HostInfo: "examplebucket-1250000000.cos.ap-shanghai.myqcloud.com", | 
				
			|||
				}, | 
				
			|||
			}, | 
				
			|||
		}, | 
				
			|||
	} | 
				
			|||
 | 
				
			|||
	mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { | 
				
			|||
		testMethod(t, r, "PUT") | 
				
			|||
		vs := values{ | 
				
			|||
			"origin": "", | 
				
			|||
		} | 
				
			|||
		testFormValues(t, r, vs) | 
				
			|||
 | 
				
			|||
		body := new(BucketPutOriginOptions) | 
				
			|||
		xml.NewDecoder(r.Body).Decode(body) | 
				
			|||
		want := opt | 
				
			|||
		want.XMLName = xml.Name{Local: "OriginConfiguration"} | 
				
			|||
		if !reflect.DeepEqual(body, want) { | 
				
			|||
			t.Errorf("Bucket.PutOrigin request\n body: %+v\n, want %+v\n", body, want) | 
				
			|||
		} | 
				
			|||
	}) | 
				
			|||
 | 
				
			|||
	_, err := client.Bucket.PutOrigin(context.Background(), opt) | 
				
			|||
	if err != nil { | 
				
			|||
		t.Fatalf("Bucket.PutOrigin returned error: %v", err) | 
				
			|||
	} | 
				
			|||
} | 
				
			|||
 | 
				
			|||
func TestBucketService_DeleteOrigin(t *testing.T) { | 
				
			|||
	setup() | 
				
			|||
	defer teardown() | 
				
			|||
	mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { | 
				
			|||
		testMethod(t, r, http.MethodDelete) | 
				
			|||
		vs := values{ | 
				
			|||
			"origin": "", | 
				
			|||
		} | 
				
			|||
		testFormValues(t, r, vs) | 
				
			|||
		w.WriteHeader(http.StatusNoContent) | 
				
			|||
	}) | 
				
			|||
	_, err := client.Bucket.DeleteOrigin(context.Background()) | 
				
			|||
	if err != nil { | 
				
			|||
		t.Fatalf("Bucket.DeleteOrigin returned error: %v", err) | 
				
			|||
	} | 
				
			|||
} | 
				
			|||
@ -0,0 +1,121 @@ | 
				
			|||
package cos | 
				
			|||
 | 
				
			|||
import ( | 
				
			|||
	"context" | 
				
			|||
	"encoding/json" | 
				
			|||
	"fmt" | 
				
			|||
	"net/http" | 
				
			|||
	"reflect" | 
				
			|||
	"testing" | 
				
			|||
) | 
				
			|||
 | 
				
			|||
func TestBucketService_GetPolicy(t *testing.T) { | 
				
			|||
	setup() | 
				
			|||
	defer teardown() | 
				
			|||
 | 
				
			|||
	mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { | 
				
			|||
		testMethod(t, r, "GET") | 
				
			|||
		vs := values{ | 
				
			|||
			"policy": "", | 
				
			|||
		} | 
				
			|||
		testFormValues(t, r, vs) | 
				
			|||
		fmt.Fprint(w, `{ | 
				
			|||
            "Statement": [ | 
				
			|||
            { | 
				
			|||
                "Principal": { | 
				
			|||
                    "qcs": [ | 
				
			|||
                    "qcs::cam::uin/100000000001:uin/100000000011" | 
				
			|||
                    ] | 
				
			|||
                }, | 
				
			|||
                "Effect": "allow", | 
				
			|||
                "Action": [ | 
				
			|||
                "name/cos:GetBucket" | 
				
			|||
                ], | 
				
			|||
                "Resource": [ | 
				
			|||
                "qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*" | 
				
			|||
                ] | 
				
			|||
            } | 
				
			|||
            ], | 
				
			|||
            "version": "2.0" | 
				
			|||
        }`) | 
				
			|||
	}) | 
				
			|||
 | 
				
			|||
	res, _, err := client.Bucket.GetPolicy(context.Background()) | 
				
			|||
	if err != nil { | 
				
			|||
		t.Fatalf("Bucket.GetPolicy returned error %v", err) | 
				
			|||
	} | 
				
			|||
 | 
				
			|||
	want := &BucketGetPolicyResult{ | 
				
			|||
		Statement: []BucketStatement{ | 
				
			|||
			{ | 
				
			|||
				Principal: map[string][]string{ | 
				
			|||
					"qcs": []string{"qcs::cam::uin/100000000001:uin/100000000011"}, | 
				
			|||
				}, | 
				
			|||
				Effect:   "allow", | 
				
			|||
				Action:   []string{"name/cos:GetBucket"}, | 
				
			|||
				Resource: []string{"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*"}, | 
				
			|||
			}, | 
				
			|||
		}, | 
				
			|||
		Version: "2.0", | 
				
			|||
	} | 
				
			|||
 | 
				
			|||
	if !reflect.DeepEqual(res, want) { | 
				
			|||
		t.Errorf("Bucket.GetPolicy returned %+v, want %+v", res, want) | 
				
			|||
	} | 
				
			|||
} | 
				
			|||
 | 
				
			|||
func TestBucketService_PutPolicy(t *testing.T) { | 
				
			|||
	setup() | 
				
			|||
	defer teardown() | 
				
			|||
 | 
				
			|||
	opt := &BucketPutPolicyOptions{ | 
				
			|||
		Statement: []BucketStatement{ | 
				
			|||
			{ | 
				
			|||
				Principal: map[string][]string{ | 
				
			|||
					"qcs": []string{"qcs::cam::uin/100000000001:uin/100000000011"}, | 
				
			|||
				}, | 
				
			|||
				Effect:   "allow", | 
				
			|||
				Action:   []string{"name/cos:GetBucket"}, | 
				
			|||
				Resource: []string{"qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*"}, | 
				
			|||
			}, | 
				
			|||
		}, | 
				
			|||
		Version: "2.0", | 
				
			|||
	} | 
				
			|||
 | 
				
			|||
	mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { | 
				
			|||
		testMethod(t, r, "PUT") | 
				
			|||
		vs := values{ | 
				
			|||
			"policy": "", | 
				
			|||
		} | 
				
			|||
		testFormValues(t, r, vs) | 
				
			|||
 | 
				
			|||
		body := new(BucketPutPolicyOptions) | 
				
			|||
		json.NewDecoder(r.Body).Decode(body) | 
				
			|||
		want := opt | 
				
			|||
		if !reflect.DeepEqual(body, want) { | 
				
			|||
			t.Errorf("Bucket.PutPolicy request\n body: %+v\n, want %+v\n", body, want) | 
				
			|||
		} | 
				
			|||
	}) | 
				
			|||
 | 
				
			|||
	_, err := client.Bucket.PutPolicy(context.Background(), opt) | 
				
			|||
	if err != nil { | 
				
			|||
		t.Fatalf("Bucket.PutPolicy returned error: %v", err) | 
				
			|||
	} | 
				
			|||
} | 
				
			|||
 | 
				
			|||
func TestBucketService_DeletePolicy(t *testing.T) { | 
				
			|||
	setup() | 
				
			|||
	defer teardown() | 
				
			|||
	mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { | 
				
			|||
		testMethod(t, r, http.MethodDelete) | 
				
			|||
		vs := values{ | 
				
			|||
			"policy": "", | 
				
			|||
		} | 
				
			|||
		testFormValues(t, r, vs) | 
				
			|||
		w.WriteHeader(http.StatusNoContent) | 
				
			|||
	}) | 
				
			|||
	_, err := client.Bucket.DeletePolicy(context.Background()) | 
				
			|||
	if err != nil { | 
				
			|||
		t.Fatalf("Bucket.DeletePolicy returned error: %v", err) | 
				
			|||
	} | 
				
			|||
} | 
				
			|||
@ -0,0 +1,497 @@ | 
				
			|||
package cos | 
				
			|||
 | 
				
			|||
import ( | 
				
			|||
	"bytes" | 
				
			|||
	"context" | 
				
			|||
	"crypto/rand" | 
				
			|||
	"encoding/json" | 
				
			|||
	"encoding/xml" | 
				
			|||
	"fmt" | 
				
			|||
	"hash/crc64" | 
				
			|||
	"io/ioutil" | 
				
			|||
	"net/http" | 
				
			|||
	"os" | 
				
			|||
	"reflect" | 
				
			|||
	"strconv" | 
				
			|||
	"testing" | 
				
			|||
	"time" | 
				
			|||
) | 
				
			|||
 | 
				
			|||
func TestCIService_EncodePicOperations(t *testing.T) { | 
				
			|||
	opt := &PicOperations{ | 
				
			|||
		IsPicInfo: 1, | 
				
			|||
		Rules: []PicOperationsRules{ | 
				
			|||
			{ | 
				
			|||
				FileId: "example.jpg", | 
				
			|||
				Rule:   "imageView2/format/png", | 
				
			|||
			}, | 
				
			|||
		}, | 
				
			|||
	} | 
				
			|||
	res := EncodePicOperations(opt) | 
				
			|||
	jsonStr := `{"is_pic_info":1,"rules":[{"fileid":"example.jpg","rule":"imageView2/format/png"}]}` | 
				
			|||
	if jsonStr != res { | 
				
			|||
		t.Fatalf("EncodePicOperations Failed, returned:%v, want:%v", res, jsonStr) | 
				
			|||
	} | 
				
			|||
} | 
				
			|||
 | 
				
			|||
func TestCIService_ImageProcess(t *testing.T) { | 
				
			|||
	setup() | 
				
			|||
	defer teardown() | 
				
			|||
	name := "test.jpg" | 
				
			|||
 | 
				
			|||
	opt := &ImageProcessOptions{ | 
				
			|||
		IsPicInfo: 1, | 
				
			|||
		Rules: []PicOperationsRules{ | 
				
			|||
			{ | 
				
			|||
				FileId: "format.jpg", | 
				
			|||
				Rule:   "imageView2/format/png", | 
				
			|||
			}, | 
				
			|||
		}, | 
				
			|||
	} | 
				
			|||
	mux.HandleFunc("/test.jpg", func(w http.ResponseWriter, r *http.Request) { | 
				
			|||
		testMethod(t, r, "POST") | 
				
			|||
		vs := values{ | 
				
			|||
			"image_process": "", | 
				
			|||
		} | 
				
			|||
		testFormValues(t, r, vs) | 
				
			|||
		header := r.Header.Get("Pic-Operations") | 
				
			|||
		body := new(ImageProcessOptions) | 
				
			|||
		err := json.Unmarshal([]byte(header), body) | 
				
			|||
		want := opt | 
				
			|||
		if err != nil { | 
				
			|||
			t.Errorf("CI.ImageProcess Failed: %v", err) | 
				
			|||
		} | 
				
			|||
		if !reflect.DeepEqual(want, body) { | 
				
			|||
			t.Errorf("CI.ImageProcess Failed, wanted:%v, body:%v", want, body) | 
				
			|||
		} | 
				
			|||
		fmt.Fprint(w, `<UploadResult> | 
				
			|||
    <OriginalInfo> | 
				
			|||
        <Key>test.jpg</Key> | 
				
			|||
        <Location>example-1250000000.cos.ap-guangzhou.myqcloud.com/test.jpg</Location> | 
				
			|||
        <ETag>"8894dbe5e3ebfaf761e39b9d619c28f3327b8d85"</ETag> | 
				
			|||
        <ImageInfo> | 
				
			|||
            <Format>PNG</Format> | 
				
			|||
            <Width>103</Width> | 
				
			|||
            <Height>99</Height> | 
				
			|||
            <Quality>100</Quality> | 
				
			|||
            <Ave>0xa08162</Ave> | 
				
			|||
            <Orientation>0</Orientation> | 
				
			|||
        </ImageInfo> | 
				
			|||
    </OriginalInfo> | 
				
			|||
    <ProcessResults> | 
				
			|||
        <Object> | 
				
			|||
            <Key>format.jpg</Key> | 
				
			|||
            <Location>example-1250000000.cos.ap-guangzhou.myqcloud.com/format.jpg</Location> | 
				
			|||
            <Format>PNG</Format> | 
				
			|||
            <Width>103</Width> | 
				
			|||
            <Height>99</Height> | 
				
			|||
            <Size>21351</Size> | 
				
			|||
            <Quality>100</Quality> | 
				
			|||
            <ETag>"8894dbe5e3ebfaf761e39b9d619c28f3327b8d85"</ETag> | 
				
			|||
        </Object> | 
				
			|||
    </ProcessResults> | 
				
			|||
</UploadResult>`) | 
				
			|||
	}) | 
				
			|||
 | 
				
			|||
	want := &ImageProcessResult{ | 
				
			|||
		XMLName: xml.Name{Local: "UploadResult"}, | 
				
			|||
		OriginalInfo: &PicOriginalInfo{ | 
				
			|||
			Key:      "test.jpg", | 
				
			|||
			Location: "example-1250000000.cos.ap-guangzhou.myqcloud.com/test.jpg", | 
				
			|||
			ETag:     "\"8894dbe5e3ebfaf761e39b9d619c28f3327b8d85\"", | 
				
			|||
			ImageInfo: &PicImageInfo{ | 
				
			|||
				Format:      "PNG", | 
				
			|||
				Width:       103, | 
				
			|||
				Height:      99, | 
				
			|||
				Quality:     100, | 
				
			|||
				Ave:         "0xa08162", | 
				
			|||
				Orientation: 0, | 
				
			|||
			}, | 
				
			|||
		}, | 
				
			|||
		ProcessResults: &PicProcessObject{ | 
				
			|||
			Key:      "format.jpg", | 
				
			|||
			Location: "example-1250000000.cos.ap-guangzhou.myqcloud.com/format.jpg", | 
				
			|||
			Format:   "PNG", | 
				
			|||
			Width:    103, | 
				
			|||
			Height:   99, | 
				
			|||
			Size:     21351, | 
				
			|||
			Quality:  100, | 
				
			|||
			ETag:     "\"8894dbe5e3ebfaf761e39b9d619c28f3327b8d85\"", | 
				
			|||
		}, | 
				
			|||
	} | 
				
			|||
 | 
				
			|||
	res, _, err := client.CI.ImageProcess(context.Background(), name, opt) | 
				
			|||
	if err != nil { | 
				
			|||
		t.Fatalf("CI.ImageProcess returned error: %v", err) | 
				
			|||
	} | 
				
			|||
	if !reflect.DeepEqual(res, want) { | 
				
			|||
		t.Errorf("CI.ImageProcess failed, return:%v, want:%v", res, want) | 
				
			|||
	} | 
				
			|||
} | 
				
			|||
 | 
				
			|||
func TestCIService_ImageRecognition(t *testing.T) { | 
				
			|||
	setup() | 
				
			|||
	defer teardown() | 
				
			|||
	name := "test.jpg" | 
				
			|||
 | 
				
			|||
	detectType := "porn,terrorist,politics" | 
				
			|||
	mux.HandleFunc("/test.jpg", func(w http.ResponseWriter, r *http.Request) { | 
				
			|||
		testMethod(t, r, "GET") | 
				
			|||
		vs := values{ | 
				
			|||
			"ci-process":  "sensitive-content-recognition", | 
				
			|||
			"detect-type": "porn,terrorist,politics", | 
				
			|||
		} | 
				
			|||
		testFormValues(t, r, vs) | 
				
			|||
		fmt.Fprint(w, `<RecognitionResult> | 
				
			|||
    <PornInfo> | 
				
			|||
        <Code>0</Code> | 
				
			|||
        <Msg>OK</Msg> | 
				
			|||
        <HitFlag>0</HitFlag> | 
				
			|||
        <Score>0</Score> | 
				
			|||
        <Label/> | 
				
			|||
    </PornInfo> | 
				
			|||
    <TerroristInfo> | 
				
			|||
        <Code>0</Code> | 
				
			|||
        <Msg>OK</Msg> | 
				
			|||
        <HitFlag>0</HitFlag> | 
				
			|||
        <Score>0</Score> | 
				
			|||
        <Label/> | 
				
			|||
    </TerroristInfo> | 
				
			|||
    <PoliticsInfo> | 
				
			|||
        <Code>0</Code> | 
				
			|||
        <Msg>OK</Msg> | 
				
			|||
        <HitFlag>0</HitFlag> | 
				
			|||
        <Score>0</Score> | 
				
			|||
        <Label/> | 
				
			|||
    </PoliticsInfo> | 
				
			|||
</RecognitionResult>`) | 
				
			|||
	}) | 
				
			|||
 | 
				
			|||
	want := &ImageRecognitionResult{ | 
				
			|||
		XMLName: xml.Name{Local: "RecognitionResult"}, | 
				
			|||
		PornInfo: &RecognitionInfo{ | 
				
			|||
			Code:    0, | 
				
			|||
			Msg:     "OK", | 
				
			|||
			HitFlag: 0, | 
				
			|||
			Score:   0, | 
				
			|||
		}, | 
				
			|||
		TerroristInfo: &RecognitionInfo{ | 
				
			|||
			Code:    0, | 
				
			|||
			Msg:     "OK", | 
				
			|||
			HitFlag: 0, | 
				
			|||
			Score:   0, | 
				
			|||
		}, | 
				
			|||
		PoliticsInfo: &RecognitionInfo{ | 
				
			|||
			Code:    0, | 
				
			|||
			Msg:     "OK", | 
				
			|||
			HitFlag: 0, | 
				
			|||
			Score:   0, | 
				
			|||
		}, | 
				
			|||
	} | 
				
			|||
 | 
				
			|||
	res, _, err := client.CI.ImageRecognition(context.Background(), name, detectType) | 
				
			|||
	if err != nil { | 
				
			|||
		t.Fatalf("CI.ImageRecognitionreturned error: %v", err) | 
				
			|||
	} | 
				
			|||
	if !reflect.DeepEqual(res, want) { | 
				
			|||
		t.Errorf("CI.ImageRecognition failed, return:%v, want:%v", res, want) | 
				
			|||
	} | 
				
			|||
} | 
				
			|||
 | 
				
			|||
func TestCIService_Put(t *testing.T) { | 
				
			|||
	setup() | 
				
			|||
	defer teardown() | 
				
			|||
	name := "test.jpg" | 
				
			|||
	data := make([]byte, 1024*1024*3) | 
				
			|||
	rand.Read(data) | 
				
			|||
 | 
				
			|||
	pic := &ImageProcessOptions{ | 
				
			|||
		IsPicInfo: 1, | 
				
			|||
		Rules: []PicOperationsRules{ | 
				
			|||
			{ | 
				
			|||
				FileId: "format.jpg", | 
				
			|||
				Rule:   "imageView2/format/png", | 
				
			|||
			}, | 
				
			|||
		}, | 
				
			|||
	} | 
				
			|||
	mux.HandleFunc("/test.jpg", func(w http.ResponseWriter, r *http.Request) { | 
				
			|||
		testMethod(t, r, "PUT") | 
				
			|||
		header := r.Header.Get("Pic-Operations") | 
				
			|||
		body := new(ImageProcessOptions) | 
				
			|||
		err := json.Unmarshal([]byte(header), body) | 
				
			|||
		want := pic | 
				
			|||
		if err != nil { | 
				
			|||
			t.Errorf("CI.Put Failed: %v", err) | 
				
			|||
		} | 
				
			|||
		if !reflect.DeepEqual(want, body) { | 
				
			|||
			t.Errorf("CI.Put Failed, wanted:%v, body:%v", want, body) | 
				
			|||
		} | 
				
			|||
		tb := crc64.MakeTable(crc64.ECMA) | 
				
			|||
		ht := crc64.New(tb) | 
				
			|||
		tr := TeeReader(r.Body, ht, 0, nil) | 
				
			|||
		bs, err := ioutil.ReadAll(tr) | 
				
			|||
		if err != nil { | 
				
			|||
			t.Errorf("CI.Put ReadAll Failed: %v", err) | 
				
			|||
		} | 
				
			|||
		if bytes.Compare(bs, data) != 0 { | 
				
			|||
			t.Errorf("CI.Put Failed, data isn't consistent") | 
				
			|||
		} | 
				
			|||
		crc := tr.Crc64() | 
				
			|||
		w.Header().Add("x-cos-hash-crc64ecma", strconv.FormatUint(crc, 10)) | 
				
			|||
		fmt.Fprint(w, `<UploadResult> | 
				
			|||
    <OriginalInfo> | 
				
			|||
        <Key>test.jpg</Key> | 
				
			|||
        <Location>example-1250000000.cos.ap-guangzhou.myqcloud.com/test.jpg</Location> | 
				
			|||
        <ETag>"8894dbe5e3ebfaf761e39b9d619c28f3327b8d85"</ETag> | 
				
			|||
        <ImageInfo> | 
				
			|||
            <Format>PNG</Format> | 
				
			|||
            <Width>103</Width> | 
				
			|||
            <Height>99</Height> | 
				
			|||
            <Quality>100</Quality> | 
				
			|||
            <Ave>0xa08162</Ave> | 
				
			|||
            <Orientation>0</Orientation> | 
				
			|||
        </ImageInfo> | 
				
			|||
    </OriginalInfo> | 
				
			|||
    <ProcessResults> | 
				
			|||
        <Object> | 
				
			|||
            <Key>format.jpg</Key> | 
				
			|||
            <Location>example-1250000000.cos.ap-guangzhou.myqcloud.com/format.jpg</Location> | 
				
			|||
            <Format>PNG</Format> | 
				
			|||
            <Width>103</Width> | 
				
			|||
            <Height>99</Height> | 
				
			|||
            <Size>21351</Size> | 
				
			|||
            <Quality>100</Quality> | 
				
			|||
            <ETag>"8894dbe5e3ebfaf761e39b9d619c28f3327b8d85"</ETag> | 
				
			|||
        </Object> | 
				
			|||
    </ProcessResults> | 
				
			|||
</UploadResult>`) | 
				
			|||
	}) | 
				
			|||
 | 
				
			|||
	want := &ImageProcessResult{ | 
				
			|||
		XMLName: xml.Name{Local: "UploadResult"}, | 
				
			|||
		OriginalInfo: &PicOriginalInfo{ | 
				
			|||
			Key:      "test.jpg", | 
				
			|||
			Location: "example-1250000000.cos.ap-guangzhou.myqcloud.com/test.jpg", | 
				
			|||
			ETag:     "\"8894dbe5e3ebfaf761e39b9d619c28f3327b8d85\"", | 
				
			|||
			ImageInfo: &PicImageInfo{ | 
				
			|||
				Format:      "PNG", | 
				
			|||
				Width:       103, | 
				
			|||
				Height:      99, | 
				
			|||
				Quality:     100, | 
				
			|||
				Ave:         "0xa08162", | 
				
			|||
				Orientation: 0, | 
				
			|||
			}, | 
				
			|||
		}, | 
				
			|||
		ProcessResults: &PicProcessObject{ | 
				
			|||
			Key:      "format.jpg", | 
				
			|||
			Location: "example-1250000000.cos.ap-guangzhou.myqcloud.com/format.jpg", | 
				
			|||
			Format:   "PNG", | 
				
			|||
			Width:    103, | 
				
			|||
			Height:   99, | 
				
			|||
			Size:     21351, | 
				
			|||
			Quality:  100, | 
				
			|||
			ETag:     "\"8894dbe5e3ebfaf761e39b9d619c28f3327b8d85\"", | 
				
			|||
		}, | 
				
			|||
	} | 
				
			|||
 | 
				
			|||
	f := bytes.NewReader(data) | 
				
			|||
	opt := &ObjectPutOptions{ | 
				
			|||
		nil, | 
				
			|||
		&ObjectPutHeaderOptions{ | 
				
			|||
			XOptionHeader: &http.Header{}, | 
				
			|||
		}, | 
				
			|||
	} | 
				
			|||
	opt.XOptionHeader.Add("Pic-Operations", EncodePicOperations(pic)) | 
				
			|||
	res, _, err := client.CI.Put(context.Background(), name, f, opt) | 
				
			|||
	if err != nil { | 
				
			|||
		t.Fatalf("CI.Put returned error: %v", err) | 
				
			|||
	} | 
				
			|||
	if !reflect.DeepEqual(res, want) { | 
				
			|||
		t.Errorf("CI.ImageProcess failed, return:%v, want:%v", res, want) | 
				
			|||
	} | 
				
			|||
} | 
				
			|||
 | 
				
			|||
func TestCIService_PutFromFile(t *testing.T) { | 
				
			|||
	setup() | 
				
			|||
	defer teardown() | 
				
			|||
	name := "test.jpg" | 
				
			|||
	filePath := "test.file" + time.Now().Format(time.RFC3339) | 
				
			|||
	newfile, err := os.Create(filePath) | 
				
			|||
	if err != nil { | 
				
			|||
		t.Fatalf("creat tmp file failed") | 
				
			|||
	} | 
				
			|||
	defer os.Remove(filePath) | 
				
			|||
	data := make([]byte, 1024*1024*3) | 
				
			|||
	rand.Read(data) | 
				
			|||
	newfile.Write(data) | 
				
			|||
	newfile.Close() | 
				
			|||
 | 
				
			|||
	pic := &ImageProcessOptions{ | 
				
			|||
		IsPicInfo: 1, | 
				
			|||
		Rules: []PicOperationsRules{ | 
				
			|||
			{ | 
				
			|||
				FileId: "format.jpg", | 
				
			|||
				Rule:   "imageView2/format/png", | 
				
			|||
			}, | 
				
			|||
		}, | 
				
			|||
	} | 
				
			|||
	mux.HandleFunc("/test.jpg", func(w http.ResponseWriter, r *http.Request) { | 
				
			|||
		testMethod(t, r, "PUT") | 
				
			|||
		header := r.Header.Get("Pic-Operations") | 
				
			|||
		body := new(ImageProcessOptions) | 
				
			|||
		err := json.Unmarshal([]byte(header), body) | 
				
			|||
		want := pic | 
				
			|||
		if err != nil { | 
				
			|||
			t.Errorf("CI.Put Failed: %v", err) | 
				
			|||
		} | 
				
			|||
		if !reflect.DeepEqual(want, body) { | 
				
			|||
			t.Errorf("CI.Put Failed, wanted:%v, body:%v", want, body) | 
				
			|||
		} | 
				
			|||
		tb := crc64.MakeTable(crc64.ECMA) | 
				
			|||
		ht := crc64.New(tb) | 
				
			|||
		tr := TeeReader(r.Body, ht, 0, nil) | 
				
			|||
		bs, err := ioutil.ReadAll(tr) | 
				
			|||
		if err != nil { | 
				
			|||
			t.Errorf("CI.Put ReadAll Failed: %v", err) | 
				
			|||
		} | 
				
			|||
		if bytes.Compare(bs, data) != 0 { | 
				
			|||
			t.Errorf("CI.Put Failed, data isn't consistent") | 
				
			|||
		} | 
				
			|||
		crc := tr.Crc64() | 
				
			|||
		w.Header().Add("x-cos-hash-crc64ecma", strconv.FormatUint(crc, 10)) | 
				
			|||
		fmt.Fprint(w, `<UploadResult> | 
				
			|||
    <OriginalInfo> | 
				
			|||
        <Key>test.jpg</Key> | 
				
			|||
        <Location>example-1250000000.cos.ap-guangzhou.myqcloud.com/test.jpg</Location> | 
				
			|||
        <ETag>"8894dbe5e3ebfaf761e39b9d619c28f3327b8d85"</ETag> | 
				
			|||
        <ImageInfo> | 
				
			|||
            <Format>PNG</Format> | 
				
			|||
            <Width>103</Width> | 
				
			|||
            <Height>99</Height> | 
				
			|||
            <Quality>100</Quality> | 
				
			|||
            <Ave>0xa08162</Ave> | 
				
			|||
            <Orientation>0</Orientation> | 
				
			|||
        </ImageInfo> | 
				
			|||
    </OriginalInfo> | 
				
			|||
    <ProcessResults> | 
				
			|||
        <Object> | 
				
			|||
            <Key>format.jpg</Key> | 
				
			|||
            <Location>example-1250000000.cos.ap-guangzhou.myqcloud.com/format.jpg</Location> | 
				
			|||
            <Format>PNG</Format> | 
				
			|||
            <Width>103</Width> | 
				
			|||
            <Height>99</Height> | 
				
			|||
            <Size>21351</Size> | 
				
			|||
            <Quality>100</Quality> | 
				
			|||
            <ETag>"8894dbe5e3ebfaf761e39b9d619c28f3327b8d85"</ETag> | 
				
			|||
        </Object> | 
				
			|||
    </ProcessResults> | 
				
			|||
</UploadResult>`) | 
				
			|||
	}) | 
				
			|||
 | 
				
			|||
	want := &ImageProcessResult{ | 
				
			|||
		XMLName: xml.Name{Local: "UploadResult"}, | 
				
			|||
		OriginalInfo: &PicOriginalInfo{ | 
				
			|||
			Key:      "test.jpg", | 
				
			|||
			Location: "example-1250000000.cos.ap-guangzhou.myqcloud.com/test.jpg", | 
				
			|||
			ETag:     "\"8894dbe5e3ebfaf761e39b9d619c28f3327b8d85\"", | 
				
			|||
			ImageInfo: &PicImageInfo{ | 
				
			|||
				Format:      "PNG", | 
				
			|||
				Width:       103, | 
				
			|||
				Height:      99, | 
				
			|||
				Quality:     100, | 
				
			|||
				Ave:         "0xa08162", | 
				
			|||
				Orientation: 0, | 
				
			|||
			}, | 
				
			|||
		}, | 
				
			|||
		ProcessResults: &PicProcessObject{ | 
				
			|||
			Key:      "format.jpg", | 
				
			|||
			Location: "example-1250000000.cos.ap-guangzhou.myqcloud.com/format.jpg", | 
				
			|||
			Format:   "PNG", | 
				
			|||
			Width:    103, | 
				
			|||
			Height:   99, | 
				
			|||
			Size:     21351, | 
				
			|||
			Quality:  100, | 
				
			|||
			ETag:     "\"8894dbe5e3ebfaf761e39b9d619c28f3327b8d85\"", | 
				
			|||
		}, | 
				
			|||
	} | 
				
			|||
 | 
				
			|||
	opt := &ObjectPutOptions{ | 
				
			|||
		nil, | 
				
			|||
		&ObjectPutHeaderOptions{ | 
				
			|||
			XOptionHeader: &http.Header{}, | 
				
			|||
		}, | 
				
			|||
	} | 
				
			|||
	opt.XOptionHeader.Add("Pic-Operations", EncodePicOperations(pic)) | 
				
			|||
	res, _, err := client.CI.PutFromFile(context.Background(), name, filePath, opt) | 
				
			|||
	if err != nil { | 
				
			|||
		t.Fatalf("CI.Put returned error: %v", err) | 
				
			|||
	} | 
				
			|||
	if !reflect.DeepEqual(res, want) { | 
				
			|||
		t.Errorf("CI.ImageProcess failed, return:%v, want:%v", res, want) | 
				
			|||
	} | 
				
			|||
} | 
				
			|||
 | 
				
			|||
func TestBucketService_GetGuetzli(t *testing.T) { | 
				
			|||
	setup() | 
				
			|||
	defer teardown() | 
				
			|||
 | 
				
			|||
	mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { | 
				
			|||
		testMethod(t, r, "GET") | 
				
			|||
		vs := values{ | 
				
			|||
			"guetzli": "", | 
				
			|||
		} | 
				
			|||
		testFormValues(t, r, vs) | 
				
			|||
		fmt.Fprint(w, `<GuetzliStatus>on</GuetzliStatus>`) | 
				
			|||
	}) | 
				
			|||
 | 
				
			|||
	res, _, err := client.CI.GetGuetzli(context.Background()) | 
				
			|||
	if err != nil { | 
				
			|||
		t.Fatalf("CI.GetGuetzli returned error %v", err) | 
				
			|||
	} | 
				
			|||
 | 
				
			|||
	want := &GetGuetzliResult{ | 
				
			|||
		XMLName:       xml.Name{Local: "GuetzliStatus"}, | 
				
			|||
		GuetzliStatus: "on", | 
				
			|||
	} | 
				
			|||
 | 
				
			|||
	if !reflect.DeepEqual(res, want) { | 
				
			|||
		t.Errorf("CI.GetGuetzli %+v, want %+v", res, want) | 
				
			|||
	} | 
				
			|||
} | 
				
			|||
 | 
				
			|||
func TestBucketService_PutGuetzli(t *testing.T) { | 
				
			|||
	setup() | 
				
			|||
	defer teardown() | 
				
			|||
 | 
				
			|||
	mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { | 
				
			|||
		testMethod(t, r, "PUT") | 
				
			|||
		vs := values{ | 
				
			|||
			"guetzli": "", | 
				
			|||
		} | 
				
			|||
		testFormValues(t, r, vs) | 
				
			|||
	}) | 
				
			|||
 | 
				
			|||
	_, err := client.CI.PutGuetzli(context.Background()) | 
				
			|||
	if err != nil { | 
				
			|||
		t.Fatalf("CI.PutGuetzli returned error: %v", err) | 
				
			|||
	} | 
				
			|||
} | 
				
			|||
 | 
				
			|||
func TestBucketService_DeleteGuetzli(t *testing.T) { | 
				
			|||
	setup() | 
				
			|||
	defer teardown() | 
				
			|||
 | 
				
			|||
	mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { | 
				
			|||
		testMethod(t, r, "DELETE") | 
				
			|||
		vs := values{ | 
				
			|||
			"guetzli": "", | 
				
			|||
		} | 
				
			|||
		testFormValues(t, r, vs) | 
				
			|||
		w.WriteHeader(http.StatusNoContent) | 
				
			|||
	}) | 
				
			|||
 | 
				
			|||
	_, err := client.CI.DeleteGuetzli(context.Background()) | 
				
			|||
	if err != nil { | 
				
			|||
		t.Fatalf("CI.PutGuetzli returned error: %v", err) | 
				
			|||
	} | 
				
			|||
} | 
				
			|||
@ -0,0 +1,89 @@ | 
				
			|||
package main | 
				
			|||
 | 
				
			|||
import ( | 
				
			|||
	"context" | 
				
			|||
	"fmt" | 
				
			|||
	"net/http" | 
				
			|||
	"net/url" | 
				
			|||
	"os" | 
				
			|||
 | 
				
			|||
	"github.com/tencentyun/cos-go-sdk-v5" | 
				
			|||
	"github.com/tencentyun/cos-go-sdk-v5/debug" | 
				
			|||
) | 
				
			|||
 | 
				
			|||
func log_status(err error) { | 
				
			|||
	if err == nil { | 
				
			|||
		return | 
				
			|||
	} | 
				
			|||
	if cos.IsNotFoundError(err) { | 
				
			|||
		// WARN
 | 
				
			|||
		fmt.Println("WARN: Resource is not existed") | 
				
			|||
	} else if e, ok := cos.IsCOSError(err); ok { | 
				
			|||
		fmt.Printf("ERROR: Code: %v\n", e.Code) | 
				
			|||
		fmt.Printf("ERROR: Message: %v\n", e.Message) | 
				
			|||
		fmt.Printf("ERROR: Resource: %v\n", e.Resource) | 
				
			|||
		fmt.Printf("ERROR: RequestId: %v\n", e.RequestID) | 
				
			|||
		// ERROR
 | 
				
			|||
	} else { | 
				
			|||
		fmt.Printf("ERROR: %v\n", err) | 
				
			|||
		// ERROR
 | 
				
			|||
	} | 
				
			|||
} | 
				
			|||
 | 
				
			|||
func main() { | 
				
			|||
	u, _ := url.Parse("https://test-1259654469.cos.ap-guangzhou.myqcloud.com") | 
				
			|||
	b := &cos.BaseURL{BucketURL: u} | 
				
			|||
	c := cos.NewClient(b, &http.Client{ | 
				
			|||
		Transport: &cos.AuthorizationTransport{ | 
				
			|||
			SecretID:  os.Getenv("COS_SECRETID"), | 
				
			|||
			SecretKey: os.Getenv("COS_SECRETKEY"), | 
				
			|||
			Transport: &debug.DebugRequestTransport{ | 
				
			|||
				RequestHeader: true, | 
				
			|||
				// Notice when put a large file and set need the request body, might happend out of memory error.
 | 
				
			|||
				RequestBody:    false, | 
				
			|||
				ResponseHeader: true, | 
				
			|||
				ResponseBody:   false, | 
				
			|||
			}, | 
				
			|||
		}, | 
				
			|||
	}) | 
				
			|||
 | 
				
			|||
	opt := &cos.ObjectPutOptions{ | 
				
			|||
		nil, | 
				
			|||
		&cos.ObjectPutHeaderOptions{ | 
				
			|||
			XOptionHeader: &http.Header{}, | 
				
			|||
		}, | 
				
			|||
	} | 
				
			|||
	pic := &cos.PicOperations{ | 
				
			|||
		IsPicInfo: 1, | 
				
			|||
		Rules: []cos.PicOperationsRules{ | 
				
			|||
			{ | 
				
			|||
				FileId: "format.jpg", | 
				
			|||
				Rule:   "QRcode/cover/1", | 
				
			|||
			}, | 
				
			|||
		}, | 
				
			|||
	} | 
				
			|||
	opt.XOptionHeader.Add("Pic-Operations", cos.EncodePicOperations(pic)) | 
				
			|||
	name := "test.jpg" | 
				
			|||
	local_filename := "./QRcode.jpg" | 
				
			|||
	res, _, err := c.CI.PutFromFile(context.Background(), name, local_filename, opt) | 
				
			|||
	log_status(err) | 
				
			|||
	fmt.Printf("%+v\n", res) | 
				
			|||
	fmt.Printf("%+v\n", res.OriginalInfo) | 
				
			|||
	fmt.Printf("%+v\n", res.ProcessResults) | 
				
			|||
 | 
				
			|||
	res2, _, err := c.CI.GetQRcode(context.Background(), name, 0, nil) | 
				
			|||
	log_status(err) | 
				
			|||
	fmt.Printf("%+v\n", res2) | 
				
			|||
 | 
				
			|||
	gopt := &cos.GenerateQRcodeOptions{ | 
				
			|||
		QRcodeContent: fmt.Sprintf("<%v>", res2.QRcodeInfo.CodeUrl), | 
				
			|||
		Mode:          0, | 
				
			|||
		Width:         200, | 
				
			|||
	} | 
				
			|||
	res3, _, err := c.CI.GenerateQRcode(context.Background(), gopt) | 
				
			|||
	log_status(err) | 
				
			|||
	fmt.Printf("%+v\n", res3) | 
				
			|||
 | 
				
			|||
	_, _, err = c.CI.GenerateQRcodeToFile(context.Background(), "./downQRcode.jpg", gopt) | 
				
			|||
	log_status(err) | 
				
			|||
} | 
				
			|||
@ -0,0 +1,99 @@ | 
				
			|||
package main | 
				
			|||
 | 
				
			|||
import ( | 
				
			|||
	"context" | 
				
			|||
	"encoding/base64" | 
				
			|||
	"fmt" | 
				
			|||
	"net/http" | 
				
			|||
	"net/url" | 
				
			|||
	"os" | 
				
			|||
 | 
				
			|||
	"github.com/tencentyun/cos-go-sdk-v5" | 
				
			|||
	"github.com/tencentyun/cos-go-sdk-v5/debug" | 
				
			|||
) | 
				
			|||
 | 
				
			|||
func log_status(err error) { | 
				
			|||
	if err == nil { | 
				
			|||
		return | 
				
			|||
	} | 
				
			|||
	if cos.IsNotFoundError(err) { | 
				
			|||
		// WARN
 | 
				
			|||
		fmt.Println("WARN: Resource is not existed") | 
				
			|||
	} else if e, ok := cos.IsCOSError(err); ok { | 
				
			|||
		fmt.Printf("ERROR: Code: %v\n", e.Code) | 
				
			|||
		fmt.Printf("ERROR: Message: %v\n", e.Message) | 
				
			|||
		fmt.Printf("ERROR: Resource: %v\n", e.Resource) | 
				
			|||
		fmt.Printf("ERROR: RequestId: %v\n", e.RequestID) | 
				
			|||
		// ERROR
 | 
				
			|||
	} else { | 
				
			|||
		fmt.Printf("ERROR: %v\n", err) | 
				
			|||
		// ERROR
 | 
				
			|||
	} | 
				
			|||
} | 
				
			|||
 | 
				
			|||
func main() { | 
				
			|||
	u, _ := url.Parse("https://test-1259654469.cos.ap-guangzhou.myqcloud.com") | 
				
			|||
	b := &cos.BaseURL{BucketURL: u} | 
				
			|||
	c := cos.NewClient(b, &http.Client{ | 
				
			|||
		Transport: &cos.AuthorizationTransport{ | 
				
			|||
			SecretID:  os.Getenv("COS_SECRETID"), | 
				
			|||
			SecretKey: os.Getenv("COS_SECRETKEY"), | 
				
			|||
			Transport: &debug.DebugRequestTransport{ | 
				
			|||
				RequestHeader: true, | 
				
			|||
				// Notice when put a large file and set need the request body, might happend out of memory error.
 | 
				
			|||
				RequestBody:    false, | 
				
			|||
				ResponseHeader: true, | 
				
			|||
				ResponseBody:   false, | 
				
			|||
			}, | 
				
			|||
		}, | 
				
			|||
	}) | 
				
			|||
 | 
				
			|||
	// 上传时添加盲水印
 | 
				
			|||
	opt := &cos.ObjectPutOptions{ | 
				
			|||
		nil, | 
				
			|||
		&cos.ObjectPutHeaderOptions{ | 
				
			|||
			XOptionHeader: &http.Header{}, | 
				
			|||
		}, | 
				
			|||
	} | 
				
			|||
	pic := &cos.PicOperations{ | 
				
			|||
		IsPicInfo: 1, | 
				
			|||
		Rules: []cos.PicOperationsRules{ | 
				
			|||
			{ | 
				
			|||
				FileId: "format.jpg", | 
				
			|||
				Rule:   "watermark/3/type/3/text/" + base64.StdEncoding.EncodeToString([]byte("testwatermark")), | 
				
			|||
			}, | 
				
			|||
		}, | 
				
			|||
	} | 
				
			|||
	opt.XOptionHeader.Add("Pic-Operations", cos.EncodePicOperations(pic)) | 
				
			|||
	name := "test.jpg" | 
				
			|||
	local_filename := "./test.jpg" | 
				
			|||
	res, _, err := c.CI.PutFromFile(context.Background(), name, local_filename, opt) | 
				
			|||
	log_status(err) | 
				
			|||
	fmt.Printf("%+v\n", res) | 
				
			|||
 | 
				
			|||
	// 下载时添加盲水印
 | 
				
			|||
	name = "test.jpg" | 
				
			|||
	filepath := "watermark.jpg" | 
				
			|||
	_, err = c.CI.GetToFile(context.Background(), name, filepath, "watermark/3/type/3/text/"+base64.StdEncoding.EncodeToString([]byte("testwatermark")), nil) | 
				
			|||
 | 
				
			|||
	// 提取盲水印
 | 
				
			|||
	opt = &cos.ObjectPutOptions{ | 
				
			|||
		nil, | 
				
			|||
		&cos.ObjectPutHeaderOptions{ | 
				
			|||
			XOptionHeader: &http.Header{}, | 
				
			|||
		}, | 
				
			|||
	} | 
				
			|||
	pic = &cos.PicOperations{ | 
				
			|||
		IsPicInfo: 1, | 
				
			|||
		Rules: []cos.PicOperationsRules{ | 
				
			|||
			{ | 
				
			|||
				FileId: "format2.jpg", | 
				
			|||
				Rule:   "watermark/4/type/3/text/" + base64.StdEncoding.EncodeToString([]byte("testwatermark")), | 
				
			|||
			}, | 
				
			|||
		}, | 
				
			|||
	} | 
				
			|||
	opt.XOptionHeader.Add("Pic-Operations", cos.EncodePicOperations(pic)) | 
				
			|||
	name = "test2.jpg" | 
				
			|||
	_, err = c.Object.PutFromFile(context.Background(), name, filepath, opt) | 
				
			|||
	log_status(err) | 
				
			|||
} | 
				
			|||
@ -0,0 +1,68 @@ | 
				
			|||
package main | 
				
			|||
 | 
				
			|||
import ( | 
				
			|||
	"context" | 
				
			|||
	"fmt" | 
				
			|||
	"net/http" | 
				
			|||
	"net/url" | 
				
			|||
	"os" | 
				
			|||
	"time" | 
				
			|||
 | 
				
			|||
	"github.com/tencentyun/cos-go-sdk-v5" | 
				
			|||
	"github.com/tencentyun/cos-go-sdk-v5/debug" | 
				
			|||
) | 
				
			|||
 | 
				
			|||
func log_status(err error) { | 
				
			|||
	if err == nil { | 
				
			|||
		return | 
				
			|||
	} | 
				
			|||
	if cos.IsNotFoundError(err) { | 
				
			|||
		// WARN
 | 
				
			|||
		fmt.Println("WARN: Resource is not existed") | 
				
			|||
	} else if e, ok := cos.IsCOSError(err); ok { | 
				
			|||
		fmt.Printf("ERROR: Code: %v\n", e.Code) | 
				
			|||
		fmt.Printf("ERROR: Message: %v\n", e.Message) | 
				
			|||
		fmt.Printf("ERROR: Resource: %v\n", e.Resource) | 
				
			|||
		fmt.Printf("ERROR: RequestId: %v\n", e.RequestID) | 
				
			|||
		// ERROR
 | 
				
			|||
	} else { | 
				
			|||
		fmt.Printf("ERROR: %v\n", err) | 
				
			|||
		// ERROR
 | 
				
			|||
	} | 
				
			|||
} | 
				
			|||
 | 
				
			|||
func main() { | 
				
			|||
	u, _ := url.Parse("https://test-1259654469.cos.ap-guangzhou.myqcloud.com") | 
				
			|||
	cu, _ := url.Parse("http://test-1259654469.pic.ap-guangzhou.myqcloud.com") | 
				
			|||
	b := &cos.BaseURL{BucketURL: u, CIURL: cu} | 
				
			|||
	c := cos.NewClient(b, &http.Client{ | 
				
			|||
		Transport: &cos.AuthorizationTransport{ | 
				
			|||
			SecretID:  os.Getenv("COS_SECRETID"), | 
				
			|||
			SecretKey: os.Getenv("COS_SECRETKEY"), | 
				
			|||
			Transport: &debug.DebugRequestTransport{ | 
				
			|||
				RequestHeader: true, | 
				
			|||
				// Notice when put a large file and set need the request body, might happend out of memory error.
 | 
				
			|||
				RequestBody:    false, | 
				
			|||
				ResponseHeader: true, | 
				
			|||
				ResponseBody:   true, | 
				
			|||
			}, | 
				
			|||
		}, | 
				
			|||
	}) | 
				
			|||
 | 
				
			|||
	_, err := c.CI.PutGuetzli(context.Background()) | 
				
			|||
	log_status(err) | 
				
			|||
	res, _, err := c.CI.GetGuetzli(context.Background()) | 
				
			|||
	log_status(err) | 
				
			|||
	if res != nil && res.GuetzliStatus != "on" { | 
				
			|||
		fmt.Printf("Error Status: %v\n", res.GuetzliStatus) | 
				
			|||
	} | 
				
			|||
	time.Sleep(time.Second * 3) | 
				
			|||
	_, err = c.CI.DeleteGuetzli(context.Background()) | 
				
			|||
	log_status(err) | 
				
			|||
	res, _, err = c.CI.GetGuetzli(context.Background()) | 
				
			|||
	log_status(err) | 
				
			|||
	if res != nil && res.GuetzliStatus != "off" { | 
				
			|||
		fmt.Printf("Error Status: %v\n", res.GuetzliStatus) | 
				
			|||
	} | 
				
			|||
 | 
				
			|||
} | 
				
			|||
@ -1,132 +0,0 @@ | 
				
			|||
package main | 
				
			|||
 | 
				
			|||
import ( | 
				
			|||
	"context" | 
				
			|||
	"fmt" | 
				
			|||
	"io" | 
				
			|||
	"net/http" | 
				
			|||
	"net/url" | 
				
			|||
	"os" | 
				
			|||
 | 
				
			|||
	"github.com/tencentyun/cos-go-sdk-v5" | 
				
			|||
	"github.com/tencentyun/cos-go-sdk-v5/debug" | 
				
			|||
) | 
				
			|||
 | 
				
			|||
func log_status(err error) { | 
				
			|||
	if err == nil { | 
				
			|||
		return | 
				
			|||
	} | 
				
			|||
	if cos.IsNotFoundError(err) { | 
				
			|||
		// WARN
 | 
				
			|||
		fmt.Println("WARN: Resource is not existed") | 
				
			|||
	} else if e, ok := cos.IsCOSError(err); ok { | 
				
			|||
		fmt.Printf("ERROR: Code: %v\n", e.Code) | 
				
			|||
		fmt.Printf("ERROR: Message: %v\n", e.Message) | 
				
			|||
		fmt.Printf("ERROR: Resource: %v\n", e.Resource) | 
				
			|||
		fmt.Printf("ERROR: RequestId: %v\n", e.RequestID) | 
				
			|||
		// ERROR
 | 
				
			|||
	} else { | 
				
			|||
		fmt.Printf("ERROR: %v\n", err) | 
				
			|||
		// ERROR
 | 
				
			|||
	} | 
				
			|||
} | 
				
			|||
 | 
				
			|||
func main() { | 
				
			|||
	u, _ := url.Parse("https://test-1259654469.cos.ap-guangzhou.myqcloud.com") | 
				
			|||
	cu, _ := url.Parse("https://test-1259654469.ci.ap-guangzhou.myqcloud.com") | 
				
			|||
	b := &cos.BaseURL{BucketURL: u, CIURL: cu} | 
				
			|||
	c := cos.NewClient(b, &http.Client{ | 
				
			|||
		Transport: &cos.AuthorizationTransport{ | 
				
			|||
			SecretID:  os.Getenv("COS_SECRETID"), | 
				
			|||
			SecretKey: os.Getenv("COS_SECRETKEY"), | 
				
			|||
			Transport: &debug.DebugRequestTransport{ | 
				
			|||
				RequestHeader: true, | 
				
			|||
				// Notice when put a large file and set need the request body, might happend out of memory error.
 | 
				
			|||
				RequestBody:    true, | 
				
			|||
				ResponseHeader: true, | 
				
			|||
				ResponseBody:   true, | 
				
			|||
			}, | 
				
			|||
		}, | 
				
			|||
	}) | 
				
			|||
 | 
				
			|||
	// 1、UpdateDocProcessQueue
 | 
				
			|||
	updateQueueOpt := &cos.UpdateDocProcessQueueOptions{ | 
				
			|||
		Name:    "queue-doc-process-1", | 
				
			|||
		QueueID: "p111a8dd208104ce3b11c78398f658ca8", | 
				
			|||
		State:   "Active", | 
				
			|||
		NotifyConfig: &cos.DocProcessQueueNotifyConfig{ | 
				
			|||
			State: "Off", | 
				
			|||
		}, | 
				
			|||
	} | 
				
			|||
	updateQueueRes, _, err := c.CI.UpdateDocProcessQueue(context.Background(), updateQueueOpt) | 
				
			|||
	log_status(err) | 
				
			|||
	fmt.Printf("%+v\n", updateQueueRes) | 
				
			|||
 | 
				
			|||
	// 2、DescribeDocProcessQueues
 | 
				
			|||
	DescribeQueueOpt := &cos.DescribeDocProcessQueuesOptions{ | 
				
			|||
		QueueIds:   "p111a8dd208104ce3b11c78398f658ca8,p4318f85d2aa14c43b1dba6f9b78be9b3,aacb2bb066e9c4478834d4196e76c49d3", | 
				
			|||
		PageNumber: 1, | 
				
			|||
		PageSize:   2, | 
				
			|||
	} | 
				
			|||
	DescribeQueueRes, _, err := c.CI.DescribeDocProcessQueues(context.Background(), DescribeQueueOpt) | 
				
			|||
	log_status(err) | 
				
			|||
	fmt.Printf("%+v\n", DescribeQueueRes) | 
				
			|||
 | 
				
			|||
	// 3、DescribeDocProcessBuckets
 | 
				
			|||
	BucketsOpt := &cos.DescribeDocProcessBucketsOptions{ | 
				
			|||
		Regions: "All", | 
				
			|||
	} | 
				
			|||
	BucketsRes, _, err := c.CI.DescribeDocProcessBuckets(context.Background(), BucketsOpt) | 
				
			|||
	log_status(err) | 
				
			|||
	fmt.Printf("%+v\n", BucketsRes) | 
				
			|||
 | 
				
			|||
	// 4、CreateDocProcessJobs
 | 
				
			|||
	createJobOpt := &cos.CreateDocProcessJobsOptions{ | 
				
			|||
		Tag: "DocProcess", | 
				
			|||
		Input: &cos.DocProcessJobInput{ | 
				
			|||
			Object: "form.pdf", | 
				
			|||
		}, | 
				
			|||
		Operation: &cos.DocProcessJobOperation{ | 
				
			|||
			Output: &cos.DocProcessJobOutput{ | 
				
			|||
				Region: "ap-guangzhou", | 
				
			|||
				Object: "test-doc${Number}", | 
				
			|||
				Bucket: "test-1259654469", | 
				
			|||
			}, | 
				
			|||
			DocProcess: &cos.DocProcessJobDocProcess{ | 
				
			|||
				TgtType:     "png", | 
				
			|||
				StartPage:   1, | 
				
			|||
				EndPage:     -1, | 
				
			|||
				ImageParams: "watermark/1/image/aHR0cDovL3Rlc3QwMDUtMTI1MTcwNDcwOC5jb3MuYXAtY2hvbmdxaW5nLm15cWNsb3VkLmNvbS8xLmpwZw==/gravity/southeast", | 
				
			|||
			}, | 
				
			|||
		}, | 
				
			|||
		QueueId: "p111a8dd208104ce3b11c78398f658ca8", | 
				
			|||
	} | 
				
			|||
	createJobRes, _, err := c.CI.CreateDocProcessJobs(context.Background(), createJobOpt) | 
				
			|||
	log_status(err) | 
				
			|||
	fmt.Printf("%+v\n", createJobRes.JobsDetail) | 
				
			|||
 | 
				
			|||
	// 5、DescribeDocProcessJob
 | 
				
			|||
	DescribeJobRes, _, err := c.CI.DescribeDocProcessJob(context.Background(), createJobRes.JobsDetail.JobId) | 
				
			|||
	log_status(err) | 
				
			|||
	fmt.Printf("%+v\n", DescribeJobRes.JobsDetail) | 
				
			|||
 | 
				
			|||
	// 6、DescribeDocProcessJobs
 | 
				
			|||
	DescribeJobsOpt := &cos.DescribeDocProcessJobsOptions{ | 
				
			|||
		QueueId: "p111a8dd208104ce3b11c78398f658ca8", | 
				
			|||
		Tag:     "DocProcess", | 
				
			|||
	} | 
				
			|||
	DescribeJobsRes, _, err := c.CI.DescribeDocProcessJobs(context.Background(), DescribeJobsOpt) | 
				
			|||
	log_status(err) | 
				
			|||
	fmt.Printf("%+v\n", DescribeJobsRes) | 
				
			|||
 | 
				
			|||
	// 7、doc-preview
 | 
				
			|||
	opt := &cos.DocPreviewOptions{ | 
				
			|||
		Page: 1, | 
				
			|||
	} | 
				
			|||
	resp, err := c.CI.DocPreview(context.Background(), "form.pdf", opt) | 
				
			|||
	log_status(err) | 
				
			|||
	fd, _ := os.OpenFile("form.pdf", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0660) | 
				
			|||
	io.Copy(fd, resp.Body) | 
				
			|||
	fd.Close() | 
				
			|||
 | 
				
			|||
} | 
				
			|||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue