vendor: update qingstor

dep ensure needed to do this, probably after various vendor merges
This commit is contained in:
Nick Craig-Wood 2017-08-08 10:18:33 +01:00
parent ec2ea37ad2
commit c1bfdd893f
50 changed files with 777 additions and 229 deletions

18
Gopkg.lock generated
View File

@ -13,12 +13,6 @@
revision = "a5913b3f7deecba45e98ff33cefbac4fd204ddd7"
version = "v0.10.0"
[[projects]]
name = "github.com/Sirupsen/logrus"
packages = ["."]
revision = "202f25545ea4cf9b191ff7f846df5d87c9382c2b"
version = "v1.0.0"
[[projects]]
name = "github.com/Azure/azure-sdk-for-go"
packages = ["storage"]
@ -199,6 +193,12 @@
packages = ["."]
revision = "541ff5ee47f1dddf6a5281af78307d921524bcb5"
[[projects]]
name = "github.com/sirupsen/logrus"
packages = ["."]
revision = "a3f95b5c423586578a4e099b11a46c2479628cac"
version = "1.0.2"
[[projects]]
branch = "master"
name = "github.com/skratchdot/open-golang"
@ -232,8 +232,8 @@
[[projects]]
name = "github.com/yunify/qingstor-sdk-go"
packages = [".","config","logger","request","request/builder","request/data","request/errors","request/signer","request/unpacker","service","utils"]
revision = "26f2cc6f249f4c2a08ed89f1d7d566a463c1dfc2"
version = "v2.2.5"
revision = "68ce7c233bde780b2bbe1e1cf018db8e2df86361"
version = "v2.2.6"
[[projects]]
branch = "master"
@ -292,6 +292,6 @@
[solve-meta]
analyzer-name = "dep"
analyzer-version = 1
inputs-digest = "904bc0ea1f770b0473b24560dc0d24c5c647971e959e58538799c5cad1eaa97e"
inputs-digest = "0b3a6116075cedb5990bd6edb0e5cfdaa04c7b28462a9c6cb02b8cbb63a2dab6"
solver-name = "gps-cdcl"
solver-version = 1

View File

@ -10,4 +10,3 @@ install:
- go get github.com/stretchr/testify/assert
script:
- go test -race -v .
- cd hooks/null && go test -race -v .

View File

@ -1,3 +1,12 @@
# 1.0.2
* bug: quote non-string values in text formatter (#583)
* Make (*Logger) SetLevel a public method
# 1.0.1
* bug: fix escaping in text formatter (#575)
# 1.0.0
* Officially changed name to lower-case

View File

@ -1,22 +1,24 @@
# Logrus <img src="http://i.imgur.com/hTeVwmJ.png" width="40" height="40" alt=":walrus:" class="emoji" title=":walrus:"/>&nbsp;[![Build Status](https://travis-ci.org/sirupsen/logrus.svg?branch=master)](https://travis-ci.org/sirupsen/logrus)&nbsp;[![GoDoc](https://godoc.org/github.com/sirupsen/logrus?status.svg)](https://godoc.org/github.com/sirupsen/logrus)
Logrus is a structured logger for Go (golang), completely API compatible with
the standard library logger. [Godoc][godoc]. **Please note the Logrus API is not
yet stable (pre 1.0). Logrus itself is completely stable and has been used in
many large deployments. The core API is unlikely to change much but please
version control your Logrus to make sure you aren't fetching latest `master` on
every build.**
the standard library logger. [Godoc][godoc].
**Seeing weird case-sensitive problems?** Unfortunately, the author failed to
realize the consequences of renaming to lower-case. Due to the Go package
environment, this caused issues. Regretfully, there's no turning back now.
**Seeing weird case-sensitive problems?** It's in the past been possible to
import Logrus as both upper- and lower-case. Due to the Go package environment,
this caused issues in the community and we needed a standard. Some environments
experienced problems with the upper-case variant, so the lower-case was decided.
Everything using `logrus` will need to use the lower-case:
`github.com/sirupsen/logrus`. Any package that isn't, should be changed.
I am terribly sorry for this inconvenience. Logrus strives hard for backwards
compatibility, and the author failed to realize the cascading consequences of
such a name-change. To fix Glide, see [these
To fix Glide, see [these
comments](https://github.com/sirupsen/logrus/issues/553#issuecomment-306591437).
For an in-depth explanation of the casing issue, see [this
comment](https://github.com/sirupsen/logrus/issues/570#issuecomment-313933276).
**Are you interested in assisting in maintaining Logrus?** Currently I have a
lot of obligations, and I am unable to provide Logrus with the maintainership it
needs. If you'd like to help, please reach out to me at `simon at author's
username dot com`.
Nicely color-coded in development (when a TTY is attached, otherwise just
plain text):
@ -266,6 +268,7 @@ Note: Syslog hook also support connecting to local syslog (Ex. "/dev/log" or "/v
| [Logrusly](https://github.com/sebest/logrusly) | Send logs to [Loggly](https://www.loggly.com/) |
| [Logstash](https://github.com/bshuster-repo/logrus-logstash-hook) | Hook for logging to [Logstash](https://www.elastic.co/products/logstash) |
| [Mail](https://github.com/zbindenren/logrus_mail) | Hook for sending exceptions via mail |
| [Mattermost](https://github.com/shuLhan/mattermost-integration/tree/master/hooks/logrus) | Hook for logging to [Mattermost](https://mattermost.com/) |
| [Mongodb](https://github.com/weekface/mgorus) | Hook for logging to mongodb |
| [NATS-Hook](https://github.com/rybit/nats_logrus_hook) | Hook for logging to [NATS](https://nats.io) |
| [Octokit](https://github.com/dorajistyle/logrus-octokit-hook) | Hook for logging to github via octokit |
@ -280,7 +283,7 @@ Note: Syslog hook also support connecting to local syslog (Ex. "/dev/log" or "/v
| [Slackrus](https://github.com/johntdyer/slackrus) | Hook for Slack chat. |
| [Stackdriver](https://github.com/knq/sdhook) | Hook for logging to [Google Stackdriver](https://cloud.google.com/logging/) |
| [Sumorus](https://github.com/doublefree/sumorus) | Hook for logging to [SumoLogic](https://www.sumologic.com/)|
| [Syslog](https://github.com/Sirupsen/logrus/blob/master/hooks/syslog/syslog.go) | Send errors to remote syslog server. Uses standard library `log/syslog` behind the scenes. |
| [Syslog](https://github.com/sirupsen/logrus/blob/master/hooks/syslog/syslog.go) | Send errors to remote syslog server. Uses standard library `log/syslog` behind the scenes. |
| [Syslog TLS](https://github.com/shinji62/logrus-syslog-ng) | Send errors to remote syslog server with TLS support. |
| [TraceView](https://github.com/evalphobia/logrus_appneta) | Hook for logging to [AppNeta TraceView](https://www.appneta.com/products/traceview/) |
| [Typetalk](https://github.com/dragon3/logrus-typetalk-hook) | Hook for logging to [Typetalk](https://www.typetalk.in/) |
@ -449,13 +452,13 @@ Logrus has a built in facility for asserting the presence of log messages. This
```go
import(
"github.com/sirupsen/logrus"
"github.com/sirupsen/logrus/hooks/null"
"github.com/sirupsen/logrus/hooks/test"
"github.com/stretchr/testify/assert"
"testing"
)
func TestSomething(t*testing.T){
logger, hook := null.NewNullLogger()
logger, hook := test.NewNullLogger()
logger.Error("Helloerror")
assert.Equal(t, 1, len(hook.Entries))

View File

@ -31,7 +31,7 @@ func SetFormatter(formatter Formatter) {
func SetLevel(level Level) {
std.mu.Lock()
defer std.mu.Unlock()
std.setLevel(level)
std.SetLevel(level)
}
// GetLevel returns the standard logger level.

View File

@ -312,6 +312,6 @@ func (logger *Logger) level() Level {
return Level(atomic.LoadUint32((*uint32)(&logger.Level)))
}
func (logger *Logger) setLevel(level Level) {
func (logger *Logger) SetLevel(level Level) {
atomic.StoreUint32((*uint32)(&logger.Level), uint32(level))
}

View File

@ -14,7 +14,7 @@ const (
red = 31
green = 32
yellow = 33
blue = 34
blue = 36
gray = 37
)
@ -153,7 +153,7 @@ func (f *TextFormatter) needsQuoting(text string) bool {
if !((ch >= 'a' && ch <= 'z') ||
(ch >= 'A' && ch <= 'Z') ||
(ch >= '0' && ch <= '9') ||
ch == '-' || ch == '.') {
ch == '-' || ch == '.' || ch == '_' || ch == '/' || ch == '@' || ch == '^' || ch == '+') {
return true
}
}
@ -169,21 +169,21 @@ func (f *TextFormatter) appendKeyValue(b *bytes.Buffer, key string, value interf
}
func (f *TextFormatter) appendValue(b *bytes.Buffer, value interface{}) {
switch value := value.(type) {
case string:
if !f.needsQuoting(value) {
b.WriteString(value)
} else {
fmt.Fprintf(b, "%s%v%s", f.QuoteCharacter, value, f.QuoteCharacter)
}
case error:
errmsg := value.Error()
if !f.needsQuoting(errmsg) {
b.WriteString(errmsg)
} else {
fmt.Fprintf(b, "%s%v%s", f.QuoteCharacter, errmsg, f.QuoteCharacter)
}
default:
fmt.Fprint(b, value)
stringVal, ok := value.(string)
if !ok {
stringVal = fmt.Sprint(value)
}
if !f.needsQuoting(stringVal) {
b.WriteString(stringVal)
} else {
b.WriteString(f.quoteString(stringVal))
}
}
func (f *TextFormatter) quoteString(v string) string {
escapedQuote := fmt.Sprintf("\\%s", f.QuoteCharacter)
escapedValue := strings.Replace(v, f.QuoteCharacter, escapedQuote, -1)
return fmt.Sprintf("%s%v%s", f.QuoteCharacter, escapedValue, f.QuoteCharacter)
}

View File

@ -6,6 +6,7 @@ import (
"strings"
"testing"
"time"
"fmt"
)
func TestQuoting(t *testing.T) {
@ -28,7 +29,13 @@ func TestQuoting(t *testing.T) {
checkQuoting(false, "abcd")
checkQuoting(false, "v1.0")
checkQuoting(false, "1234567890")
checkQuoting(true, "/foobar")
checkQuoting(false, "/foobar")
checkQuoting(false, "foo_bar")
checkQuoting(false, "foo@bar")
checkQuoting(false, "foobar^")
checkQuoting(false, "+/-_^@f.oobar")
checkQuoting(true, "foobar$")
checkQuoting(true, "&foobar")
checkQuoting(true, "x y")
checkQuoting(true, "x,y")
checkQuoting(false, errors.New("invalid"))
@ -38,7 +45,12 @@ func TestQuoting(t *testing.T) {
tf.QuoteCharacter = "`"
checkQuoting(false, "")
checkQuoting(false, "abcd")
checkQuoting(true, "/foobar")
checkQuoting(false, "/foobar")
checkQuoting(false, "foo_bar")
checkQuoting(false, "foo@bar")
checkQuoting(false, "foobar^")
checkQuoting(true, "foobar$")
checkQuoting(true, "&foobar")
checkQuoting(true, errors.New("invalid argument"))
// Test for multi-character quotes.
@ -53,6 +65,68 @@ func TestQuoting(t *testing.T) {
checkQuoting(true, errors.New("invalid argument"))
}
func TestEscaping_DefaultQuoteCharacter(t *testing.T) {
tf := &TextFormatter{DisableColors: true}
testCases := []struct {
value string
expected string
}{
{`ba"r`, `ba\"r`},
{`ba'r`, `ba'r`},
}
for _, tc := range testCases {
b, _ := tf.Format(WithField("test", tc.value))
if !bytes.Contains(b, []byte(tc.expected)) {
t.Errorf("escaping expected for %q (result was %q instead of %q)", tc.value, string(b), tc.expected)
}
}
}
func TestEscaping_Interface(t *testing.T) {
tf := &TextFormatter{DisableColors: true}
ts := time.Now()
testCases := []struct {
value interface{}
expected string
}{
{ts, fmt.Sprintf("\"%s\"", ts.String())},
{errors.New("error: something went wrong"), "\"error: something went wrong\""},
}
for _, tc := range testCases {
b, _ := tf.Format(WithField("test", tc.value))
if !bytes.Contains(b, []byte(tc.expected)) {
t.Errorf("escaping expected for %q (result was %q instead of %q)", tc.value, string(b), tc.expected)
}
}
}
func TestEscaping_CustomQuoteCharacter(t *testing.T) {
tf := &TextFormatter{DisableColors: true}
testCases := []struct {
value string
expected string
quoteChar string
}{
{`ba"r`, `ba"r`, `'`},
{`ba'r`, `ba\'r`, `'`},
{`ba'r`, `ba'r`, `^`},
}
for _, tc := range testCases {
tf.QuoteCharacter = tc.quoteChar
b, _ := tf.Format(WithField("test", tc.value))
if !bytes.Contains(b, []byte(tc.expected)) {
t.Errorf("escaping expected for %q (result was %q instead of %q)", tc.value, string(b), tc.expected)
}
}
}
func TestTimestampFormat(t *testing.T) {
checkTimeStr := func(format string) {
customFormatter := &TextFormatter{DisableColors: true, TimestampFormat: format}

View File

@ -32,12 +32,19 @@ before_install:
mv linux-amd64 glide-v0.12.3;
fi
- pushd glide-v0.12.3 && sudo cp glide /usr/local/bin && popd
- if [[ ! -d "./snips-v0.1.0" ]]; then
wget https://github.com/yunify/snips/releases/download/v0.1.0/snips-v0.1.0-linux_amd64.tar.gz &&
mkdir snips-v0.1.0 &&
pushd snips-v0.1.0 &&
tar -vxzf ../snips-v0.1.0-linux_amd64.tar.gz &&
popd;
fi
- pushd snips-v0.1.0 && sudo cp snips /usr/local/bin && popd
- popd
- /usr/local/bin/make --version
- /usr/local/bin/glide --version
install:
- go get -u github.com/yunify/snips
- go get -u github.com/golang/lint/golint;
- glide install

View File

@ -1,6 +1,12 @@
# Change Log
All notable changes to QingStor SDK for Go will be documented in this file.
## [v2.2.6] - 2017-07-21
### Fixed
- Fix concurrency issue in object related operations.
## [v2.2.5] - 2017-05-22
### Fixed
@ -94,6 +100,7 @@ All notable changes to QingStor SDK for Go will be documented in this file.
- QingStor SDK for the Go programming language.
[v2.2.6]: https://github.com/yunify/qingstor-sdk-go/compare/v2.2.5...v2.2.6
[v2.2.5]: https://github.com/yunify/qingstor-sdk-go/compare/v2.2.4...v2.2.5
[v2.2.4]: https://github.com/yunify/qingstor-sdk-go/compare/v2.2.3...v2.2.4
[v2.2.3]: https://github.com/yunify/qingstor-sdk-go/compare/v2.2.2...v2.2.3

View File

@ -1,6 +1,11 @@
hash: 2e6b1ed4a2ee0638abc2e819ac3c247eaf80fa0f2053cfc41eecf883054c6032
updated: 2017-05-22T14:58:58.927797848+08:00
updated: 2017-07-20T20:14:05.143145325+08:00
imports:
- name: github.com/DATA-DOG/godog
version: 70f777599da0f5de682b8848d356611c1738b695
subpackages:
- colors
- gherkin
- name: github.com/pengsrc/go-shared
version: 454950d6a0782c34427d4f29b46c6bf447256f20
subpackages:
@ -8,8 +13,8 @@ imports:
- convert
- json
- yaml
- name: github.com/Sirupsen/logrus
version: d26492970760ca5d33129d2d799e34be5c4782eb
- name: github.com/sirupsen/logrus
version: 00386b3fbd637582f90cb17482dc3087646c0ac2
- name: golang.org/x/sys
version: f3918c30c5c2cb527c0b071a27c35120a6c0719a
repo: https://github.com/golang/sys.git

View File

@ -25,7 +25,7 @@ import (
"strings"
"time"
"github.com/Sirupsen/logrus"
"github.com/sirupsen/logrus"
)
var instance *logrus.Logger

View File

@ -19,6 +19,7 @@ package service
import (
"fmt"
"io"
"net/http"
"time"
"github.com/yunify/qingstor-sdk-go/config"
@ -29,6 +30,7 @@ import (
var _ fmt.State
var _ io.Reader
var _ http.Header
var _ time.Time
var _ config.Config
@ -62,7 +64,7 @@ func (s *Bucket) Delete() (*DeleteBucketOutput, error) {
return nil, err
}
requestID := r.HTTPResponse.Header.Get("X-Qs-Request-Id")
requestID := r.HTTPResponse.Header.Get(http.CanonicalHeaderKey("X-QS-Request-ID"))
x.RequestID = &requestID
return x, err
@ -71,9 +73,11 @@ func (s *Bucket) Delete() (*DeleteBucketOutput, error) {
// DeleteRequest creates request and output object of DeleteBucket.
func (s *Bucket) DeleteRequest() (*request.Request, *DeleteBucketOutput, error) {
properties := *s.Properties
o := &data.Operation{
Config: s.Config,
Properties: s.Properties,
Properties: &properties,
APIName: "DELETE Bucket",
RequestMethod: "DELETE",
RequestURI: "/<bucket-name>",
@ -112,7 +116,7 @@ func (s *Bucket) DeleteCORS() (*DeleteBucketCORSOutput, error) {
return nil, err
}
requestID := r.HTTPResponse.Header.Get("X-Qs-Request-Id")
requestID := r.HTTPResponse.Header.Get(http.CanonicalHeaderKey("X-QS-Request-ID"))
x.RequestID = &requestID
return x, err
@ -121,9 +125,11 @@ func (s *Bucket) DeleteCORS() (*DeleteBucketCORSOutput, error) {
// DeleteCORSRequest creates request and output object of DeleteBucketCORS.
func (s *Bucket) DeleteCORSRequest() (*request.Request, *DeleteBucketCORSOutput, error) {
properties := *s.Properties
o := &data.Operation{
Config: s.Config,
Properties: s.Properties,
Properties: &properties,
APIName: "DELETE Bucket CORS",
RequestMethod: "DELETE",
RequestURI: "/<bucket-name>?cors",
@ -162,7 +168,7 @@ func (s *Bucket) DeleteExternalMirror() (*DeleteBucketExternalMirrorOutput, erro
return nil, err
}
requestID := r.HTTPResponse.Header.Get("X-Qs-Request-Id")
requestID := r.HTTPResponse.Header.Get(http.CanonicalHeaderKey("X-QS-Request-ID"))
x.RequestID = &requestID
return x, err
@ -171,9 +177,11 @@ func (s *Bucket) DeleteExternalMirror() (*DeleteBucketExternalMirrorOutput, erro
// DeleteExternalMirrorRequest creates request and output object of DeleteBucketExternalMirror.
func (s *Bucket) DeleteExternalMirrorRequest() (*request.Request, *DeleteBucketExternalMirrorOutput, error) {
properties := *s.Properties
o := &data.Operation{
Config: s.Config,
Properties: s.Properties,
Properties: &properties,
APIName: "DELETE Bucket External Mirror",
RequestMethod: "DELETE",
RequestURI: "/<bucket-name>?mirror",
@ -212,7 +220,7 @@ func (s *Bucket) DeletePolicy() (*DeleteBucketPolicyOutput, error) {
return nil, err
}
requestID := r.HTTPResponse.Header.Get("X-Qs-Request-Id")
requestID := r.HTTPResponse.Header.Get(http.CanonicalHeaderKey("X-QS-Request-ID"))
x.RequestID = &requestID
return x, err
@ -221,9 +229,11 @@ func (s *Bucket) DeletePolicy() (*DeleteBucketPolicyOutput, error) {
// DeletePolicyRequest creates request and output object of DeleteBucketPolicy.
func (s *Bucket) DeletePolicyRequest() (*request.Request, *DeleteBucketPolicyOutput, error) {
properties := *s.Properties
o := &data.Operation{
Config: s.Config,
Properties: s.Properties,
Properties: &properties,
APIName: "DELETE Bucket Policy",
RequestMethod: "DELETE",
RequestURI: "/<bucket-name>?policy",
@ -262,7 +272,7 @@ func (s *Bucket) DeleteMultipleObjects(input *DeleteMultipleObjectsInput) (*Dele
return nil, err
}
requestID := r.HTTPResponse.Header.Get("X-Qs-Request-Id")
requestID := r.HTTPResponse.Header.Get(http.CanonicalHeaderKey("X-QS-Request-ID"))
x.RequestID = &requestID
return x, err
@ -275,9 +285,11 @@ func (s *Bucket) DeleteMultipleObjectsRequest(input *DeleteMultipleObjectsInput)
input = &DeleteMultipleObjectsInput{}
}
properties := *s.Properties
o := &data.Operation{
Config: s.Config,
Properties: s.Properties,
Properties: &properties,
APIName: "Delete Multiple Objects",
RequestMethod: "POST",
RequestURI: "/<bucket-name>?delete",
@ -351,7 +363,7 @@ func (s *Bucket) GetACL() (*GetBucketACLOutput, error) {
return nil, err
}
requestID := r.HTTPResponse.Header.Get("X-Qs-Request-Id")
requestID := r.HTTPResponse.Header.Get(http.CanonicalHeaderKey("X-QS-Request-ID"))
x.RequestID = &requestID
return x, err
@ -360,9 +372,11 @@ func (s *Bucket) GetACL() (*GetBucketACLOutput, error) {
// GetACLRequest creates request and output object of GetBucketACL.
func (s *Bucket) GetACLRequest() (*request.Request, *GetBucketACLOutput, error) {
properties := *s.Properties
o := &data.Operation{
Config: s.Config,
Properties: s.Properties,
Properties: &properties,
APIName: "GET Bucket ACL",
RequestMethod: "GET",
RequestURI: "/<bucket-name>?acl",
@ -406,7 +420,7 @@ func (s *Bucket) GetCORS() (*GetBucketCORSOutput, error) {
return nil, err
}
requestID := r.HTTPResponse.Header.Get("X-Qs-Request-Id")
requestID := r.HTTPResponse.Header.Get(http.CanonicalHeaderKey("X-QS-Request-ID"))
x.RequestID = &requestID
return x, err
@ -415,9 +429,11 @@ func (s *Bucket) GetCORS() (*GetBucketCORSOutput, error) {
// GetCORSRequest creates request and output object of GetBucketCORS.
func (s *Bucket) GetCORSRequest() (*request.Request, *GetBucketCORSOutput, error) {
properties := *s.Properties
o := &data.Operation{
Config: s.Config,
Properties: s.Properties,
Properties: &properties,
APIName: "GET Bucket CORS",
RequestMethod: "GET",
RequestURI: "/<bucket-name>?cors",
@ -459,7 +475,7 @@ func (s *Bucket) GetExternalMirror() (*GetBucketExternalMirrorOutput, error) {
return nil, err
}
requestID := r.HTTPResponse.Header.Get("X-Qs-Request-Id")
requestID := r.HTTPResponse.Header.Get(http.CanonicalHeaderKey("X-QS-Request-ID"))
x.RequestID = &requestID
return x, err
@ -468,9 +484,11 @@ func (s *Bucket) GetExternalMirror() (*GetBucketExternalMirrorOutput, error) {
// GetExternalMirrorRequest creates request and output object of GetBucketExternalMirror.
func (s *Bucket) GetExternalMirrorRequest() (*request.Request, *GetBucketExternalMirrorOutput, error) {
properties := *s.Properties
o := &data.Operation{
Config: s.Config,
Properties: s.Properties,
Properties: &properties,
APIName: "GET Bucket External Mirror",
RequestMethod: "GET",
RequestURI: "/<bucket-name>?mirror",
@ -512,7 +530,7 @@ func (s *Bucket) GetPolicy() (*GetBucketPolicyOutput, error) {
return nil, err
}
requestID := r.HTTPResponse.Header.Get("X-Qs-Request-Id")
requestID := r.HTTPResponse.Header.Get(http.CanonicalHeaderKey("X-QS-Request-ID"))
x.RequestID = &requestID
return x, err
@ -521,9 +539,11 @@ func (s *Bucket) GetPolicy() (*GetBucketPolicyOutput, error) {
// GetPolicyRequest creates request and output object of GetBucketPolicy.
func (s *Bucket) GetPolicyRequest() (*request.Request, *GetBucketPolicyOutput, error) {
properties := *s.Properties
o := &data.Operation{
Config: s.Config,
Properties: s.Properties,
Properties: &properties,
APIName: "GET Bucket Policy",
RequestMethod: "GET",
RequestURI: "/<bucket-name>?policy",
@ -565,7 +585,7 @@ func (s *Bucket) GetStatistics() (*GetBucketStatisticsOutput, error) {
return nil, err
}
requestID := r.HTTPResponse.Header.Get("X-Qs-Request-Id")
requestID := r.HTTPResponse.Header.Get(http.CanonicalHeaderKey("X-QS-Request-ID"))
x.RequestID = &requestID
return x, err
@ -574,9 +594,11 @@ func (s *Bucket) GetStatistics() (*GetBucketStatisticsOutput, error) {
// GetStatisticsRequest creates request and output object of GetBucketStatistics.
func (s *Bucket) GetStatisticsRequest() (*request.Request, *GetBucketStatisticsOutput, error) {
properties := *s.Properties
o := &data.Operation{
Config: s.Config,
Properties: s.Properties,
Properties: &properties,
APIName: "GET Bucket Statistics",
RequestMethod: "GET",
RequestURI: "/<bucket-name>?stats",
@ -631,7 +653,7 @@ func (s *Bucket) Head() (*HeadBucketOutput, error) {
return nil, err
}
requestID := r.HTTPResponse.Header.Get("X-Qs-Request-Id")
requestID := r.HTTPResponse.Header.Get(http.CanonicalHeaderKey("X-QS-Request-ID"))
x.RequestID = &requestID
return x, err
@ -640,9 +662,11 @@ func (s *Bucket) Head() (*HeadBucketOutput, error) {
// HeadRequest creates request and output object of HeadBucket.
func (s *Bucket) HeadRequest() (*request.Request, *HeadBucketOutput, error) {
properties := *s.Properties
o := &data.Operation{
Config: s.Config,
Properties: s.Properties,
Properties: &properties,
APIName: "HEAD Bucket",
RequestMethod: "HEAD",
RequestURI: "/<bucket-name>",
@ -681,7 +705,7 @@ func (s *Bucket) ListMultipartUploads(input *ListMultipartUploadsInput) (*ListMu
return nil, err
}
requestID := r.HTTPResponse.Header.Get("X-Qs-Request-Id")
requestID := r.HTTPResponse.Header.Get(http.CanonicalHeaderKey("X-QS-Request-ID"))
x.RequestID = &requestID
return x, err
@ -694,9 +718,11 @@ func (s *Bucket) ListMultipartUploadsRequest(input *ListMultipartUploadsInput) (
input = &ListMultipartUploadsInput{}
}
properties := *s.Properties
o := &data.Operation{
Config: s.Config,
Properties: s.Properties,
Properties: &properties,
APIName: "List Multipart Uploads",
RequestMethod: "GET",
RequestURI: "/<bucket-name>?uploads",
@ -770,7 +796,7 @@ func (s *Bucket) ListObjects(input *ListObjectsInput) (*ListObjectsOutput, error
return nil, err
}
requestID := r.HTTPResponse.Header.Get("X-Qs-Request-Id")
requestID := r.HTTPResponse.Header.Get(http.CanonicalHeaderKey("X-QS-Request-ID"))
x.RequestID = &requestID
return x, err
@ -783,9 +809,11 @@ func (s *Bucket) ListObjectsRequest(input *ListObjectsInput) (*request.Request,
input = &ListObjectsInput{}
}
properties := *s.Properties
o := &data.Operation{
Config: s.Config,
Properties: s.Properties,
Properties: &properties,
APIName: "GET Bucket (List Objects)",
RequestMethod: "GET",
RequestURI: "/<bucket-name>",
@ -861,7 +889,7 @@ func (s *Bucket) Put() (*PutBucketOutput, error) {
return nil, err
}
requestID := r.HTTPResponse.Header.Get("X-Qs-Request-Id")
requestID := r.HTTPResponse.Header.Get(http.CanonicalHeaderKey("X-QS-Request-ID"))
x.RequestID = &requestID
return x, err
@ -870,9 +898,11 @@ func (s *Bucket) Put() (*PutBucketOutput, error) {
// PutRequest creates request and output object of PutBucket.
func (s *Bucket) PutRequest() (*request.Request, *PutBucketOutput, error) {
properties := *s.Properties
o := &data.Operation{
Config: s.Config,
Properties: s.Properties,
Properties: &properties,
APIName: "PUT Bucket",
RequestMethod: "PUT",
RequestURI: "/<bucket-name>",
@ -911,7 +941,7 @@ func (s *Bucket) PutACL(input *PutBucketACLInput) (*PutBucketACLOutput, error) {
return nil, err
}
requestID := r.HTTPResponse.Header.Get("X-Qs-Request-Id")
requestID := r.HTTPResponse.Header.Get(http.CanonicalHeaderKey("X-QS-Request-ID"))
x.RequestID = &requestID
return x, err
@ -924,9 +954,11 @@ func (s *Bucket) PutACLRequest(input *PutBucketACLInput) (*request.Request, *Put
input = &PutBucketACLInput{}
}
properties := *s.Properties
o := &data.Operation{
Config: s.Config,
Properties: s.Properties,
Properties: &properties,
APIName: "PUT Bucket ACL",
RequestMethod: "PUT",
RequestURI: "/<bucket-name>?acl",
@ -993,7 +1025,7 @@ func (s *Bucket) PutCORS(input *PutBucketCORSInput) (*PutBucketCORSOutput, error
return nil, err
}
requestID := r.HTTPResponse.Header.Get("X-Qs-Request-Id")
requestID := r.HTTPResponse.Header.Get(http.CanonicalHeaderKey("X-QS-Request-ID"))
x.RequestID = &requestID
return x, err
@ -1006,9 +1038,11 @@ func (s *Bucket) PutCORSRequest(input *PutBucketCORSInput) (*request.Request, *P
input = &PutBucketCORSInput{}
}
properties := *s.Properties
o := &data.Operation{
Config: s.Config,
Properties: s.Properties,
Properties: &properties,
APIName: "PUT Bucket CORS",
RequestMethod: "PUT",
RequestURI: "/<bucket-name>?cors",
@ -1075,7 +1109,7 @@ func (s *Bucket) PutExternalMirror(input *PutBucketExternalMirrorInput) (*PutBuc
return nil, err
}
requestID := r.HTTPResponse.Header.Get("X-Qs-Request-Id")
requestID := r.HTTPResponse.Header.Get(http.CanonicalHeaderKey("X-QS-Request-ID"))
x.RequestID = &requestID
return x, err
@ -1088,9 +1122,11 @@ func (s *Bucket) PutExternalMirrorRequest(input *PutBucketExternalMirrorInput) (
input = &PutBucketExternalMirrorInput{}
}
properties := *s.Properties
o := &data.Operation{
Config: s.Config,
Properties: s.Properties,
Properties: &properties,
APIName: "PUT Bucket External Mirror",
RequestMethod: "PUT",
RequestURI: "/<bucket-name>?mirror",
@ -1149,7 +1185,7 @@ func (s *Bucket) PutPolicy(input *PutBucketPolicyInput) (*PutBucketPolicyOutput,
return nil, err
}
requestID := r.HTTPResponse.Header.Get("X-Qs-Request-Id")
requestID := r.HTTPResponse.Header.Get(http.CanonicalHeaderKey("X-QS-Request-ID"))
x.RequestID = &requestID
return x, err
@ -1162,9 +1198,11 @@ func (s *Bucket) PutPolicyRequest(input *PutBucketPolicyInput) (*request.Request
input = &PutBucketPolicyInput{}
}
properties := *s.Properties
o := &data.Operation{
Config: s.Config,
Properties: s.Properties,
Properties: &properties,
APIName: "PUT Bucket Policy",
RequestMethod: "PUT",
RequestURI: "/<bucket-name>?policy",

View File

@ -19,6 +19,7 @@ package service
import (
"fmt"
"io"
"net/http"
"time"
"github.com/yunify/qingstor-sdk-go/config"
@ -29,6 +30,7 @@ import (
var _ fmt.State
var _ io.Reader
var _ http.Header
var _ time.Time
var _ config.Config
@ -46,7 +48,7 @@ func (s *Bucket) AbortMultipartUpload(objectKey string, input *AbortMultipartUpl
return nil, err
}
requestID := r.HTTPResponse.Header.Get("X-Qs-Request-Id")
requestID := r.HTTPResponse.Header.Get(http.CanonicalHeaderKey("X-QS-Request-ID"))
x.RequestID = &requestID
return x, err
@ -59,9 +61,13 @@ func (s *Bucket) AbortMultipartUploadRequest(objectKey string, input *AbortMulti
input = &AbortMultipartUploadInput{}
}
properties := *s.Properties
properties.ObjectKey = &objectKey
o := &data.Operation{
Config: s.Config,
Properties: s.Properties,
Properties: &properties,
APIName: "Abort Multipart Upload",
RequestMethod: "DELETE",
RequestURI: "/<bucket-name>/<object-key>",
@ -70,8 +76,6 @@ func (s *Bucket) AbortMultipartUploadRequest(objectKey string, input *AbortMulti
},
}
s.Properties.ObjectKey = &objectKey
x := &AbortMultipartUploadOutput{}
r, err := request.New(o, input, x)
if err != nil {
@ -122,7 +126,7 @@ func (s *Bucket) CompleteMultipartUpload(objectKey string, input *CompleteMultip
return nil, err
}
requestID := r.HTTPResponse.Header.Get("X-Qs-Request-Id")
requestID := r.HTTPResponse.Header.Get(http.CanonicalHeaderKey("X-QS-Request-ID"))
x.RequestID = &requestID
return x, err
@ -135,9 +139,13 @@ func (s *Bucket) CompleteMultipartUploadRequest(objectKey string, input *Complet
input = &CompleteMultipartUploadInput{}
}
properties := *s.Properties
properties.ObjectKey = &objectKey
o := &data.Operation{
Config: s.Config,
Properties: s.Properties,
Properties: &properties,
APIName: "Complete multipart upload",
RequestMethod: "POST",
RequestURI: "/<bucket-name>/<object-key>",
@ -146,8 +154,6 @@ func (s *Bucket) CompleteMultipartUploadRequest(objectKey string, input *Complet
},
}
s.Properties.ObjectKey = &objectKey
x := &CompleteMultipartUploadOutput{}
r, err := request.New(o, input, x)
if err != nil {
@ -217,7 +223,7 @@ func (s *Bucket) DeleteObject(objectKey string) (*DeleteObjectOutput, error) {
return nil, err
}
requestID := r.HTTPResponse.Header.Get("X-Qs-Request-Id")
requestID := r.HTTPResponse.Header.Get(http.CanonicalHeaderKey("X-QS-Request-ID"))
x.RequestID = &requestID
return x, err
@ -226,9 +232,13 @@ func (s *Bucket) DeleteObject(objectKey string) (*DeleteObjectOutput, error) {
// DeleteObjectRequest creates request and output object of DeleteObject.
func (s *Bucket) DeleteObjectRequest(objectKey string) (*request.Request, *DeleteObjectOutput, error) {
properties := *s.Properties
properties.ObjectKey = &objectKey
o := &data.Operation{
Config: s.Config,
Properties: s.Properties,
Properties: &properties,
APIName: "DELETE Object",
RequestMethod: "DELETE",
RequestURI: "/<bucket-name>/<object-key>",
@ -237,8 +247,6 @@ func (s *Bucket) DeleteObjectRequest(objectKey string) (*request.Request, *Delet
},
}
s.Properties.ObjectKey = &objectKey
x := &DeleteObjectOutput{}
r, err := request.New(o, nil, x)
if err != nil {
@ -269,7 +277,7 @@ func (s *Bucket) GetObject(objectKey string, input *GetObjectInput) (*GetObjectO
return nil, err
}
requestID := r.HTTPResponse.Header.Get("X-Qs-Request-Id")
requestID := r.HTTPResponse.Header.Get(http.CanonicalHeaderKey("X-QS-Request-ID"))
x.RequestID = &requestID
return x, err
@ -282,9 +290,13 @@ func (s *Bucket) GetObjectRequest(objectKey string, input *GetObjectInput) (*req
input = &GetObjectInput{}
}
properties := *s.Properties
properties.ObjectKey = &objectKey
o := &data.Operation{
Config: s.Config,
Properties: s.Properties,
Properties: &properties,
APIName: "GET Object",
RequestMethod: "GET",
RequestURI: "/<bucket-name>/<object-key>",
@ -296,8 +308,6 @@ func (s *Bucket) GetObjectRequest(objectKey string, input *GetObjectInput) (*req
},
}
s.Properties.ObjectKey = &objectKey
x := &GetObjectOutput{}
r, err := request.New(o, input, x)
if err != nil {
@ -379,7 +389,7 @@ func (s *Bucket) HeadObject(objectKey string, input *HeadObjectInput) (*HeadObje
return nil, err
}
requestID := r.HTTPResponse.Header.Get("X-Qs-Request-Id")
requestID := r.HTTPResponse.Header.Get(http.CanonicalHeaderKey("X-QS-Request-ID"))
x.RequestID = &requestID
return x, err
@ -392,9 +402,13 @@ func (s *Bucket) HeadObjectRequest(objectKey string, input *HeadObjectInput) (*r
input = &HeadObjectInput{}
}
properties := *s.Properties
properties.ObjectKey = &objectKey
o := &data.Operation{
Config: s.Config,
Properties: s.Properties,
Properties: &properties,
APIName: "HEAD Object",
RequestMethod: "HEAD",
RequestURI: "/<bucket-name>/<object-key>",
@ -403,8 +417,6 @@ func (s *Bucket) HeadObjectRequest(objectKey string, input *HeadObjectInput) (*r
},
}
s.Properties.ObjectKey = &objectKey
x := &HeadObjectOutput{}
r, err := request.New(o, input, x)
if err != nil {
@ -469,7 +481,7 @@ func (s *Bucket) InitiateMultipartUpload(objectKey string, input *InitiateMultip
return nil, err
}
requestID := r.HTTPResponse.Header.Get("X-Qs-Request-Id")
requestID := r.HTTPResponse.Header.Get(http.CanonicalHeaderKey("X-QS-Request-ID"))
x.RequestID = &requestID
return x, err
@ -482,9 +494,13 @@ func (s *Bucket) InitiateMultipartUploadRequest(objectKey string, input *Initiat
input = &InitiateMultipartUploadInput{}
}
properties := *s.Properties
properties.ObjectKey = &objectKey
o := &data.Operation{
Config: s.Config,
Properties: s.Properties,
Properties: &properties,
APIName: "Initiate Multipart Upload",
RequestMethod: "POST",
RequestURI: "/<bucket-name>/<object-key>?uploads",
@ -493,8 +509,6 @@ func (s *Bucket) InitiateMultipartUploadRequest(objectKey string, input *Initiat
},
}
s.Properties.ObjectKey = &objectKey
x := &InitiateMultipartUploadOutput{}
r, err := request.New(o, input, x)
if err != nil {
@ -553,7 +567,7 @@ func (s *Bucket) ListMultipart(objectKey string, input *ListMultipartInput) (*Li
return nil, err
}
requestID := r.HTTPResponse.Header.Get("X-Qs-Request-Id")
requestID := r.HTTPResponse.Header.Get(http.CanonicalHeaderKey("X-QS-Request-ID"))
x.RequestID = &requestID
return x, err
@ -566,9 +580,13 @@ func (s *Bucket) ListMultipartRequest(objectKey string, input *ListMultipartInpu
input = &ListMultipartInput{}
}
properties := *s.Properties
properties.ObjectKey = &objectKey
o := &data.Operation{
Config: s.Config,
Properties: s.Properties,
Properties: &properties,
APIName: "List Multipart",
RequestMethod: "GET",
RequestURI: "/<bucket-name>/<object-key>",
@ -577,8 +595,6 @@ func (s *Bucket) ListMultipartRequest(objectKey string, input *ListMultipartInpu
},
}
s.Properties.ObjectKey = &objectKey
x := &ListMultipartOutput{}
r, err := request.New(o, input, x)
if err != nil {
@ -638,7 +654,7 @@ func (s *Bucket) OptionsObject(objectKey string, input *OptionsObjectInput) (*Op
return nil, err
}
requestID := r.HTTPResponse.Header.Get("X-Qs-Request-Id")
requestID := r.HTTPResponse.Header.Get(http.CanonicalHeaderKey("X-QS-Request-ID"))
x.RequestID = &requestID
return x, err
@ -651,9 +667,13 @@ func (s *Bucket) OptionsObjectRequest(objectKey string, input *OptionsObjectInpu
input = &OptionsObjectInput{}
}
properties := *s.Properties
properties.ObjectKey = &objectKey
o := &data.Operation{
Config: s.Config,
Properties: s.Properties,
Properties: &properties,
APIName: "OPTIONS Object",
RequestMethod: "OPTIONS",
RequestURI: "/<bucket-name>/<object-key>",
@ -662,8 +682,6 @@ func (s *Bucket) OptionsObjectRequest(objectKey string, input *OptionsObjectInpu
},
}
s.Properties.ObjectKey = &objectKey
x := &OptionsObjectOutput{}
r, err := request.New(o, input, x)
if err != nil {
@ -736,7 +754,7 @@ func (s *Bucket) PutObject(objectKey string, input *PutObjectInput) (*PutObjectO
return nil, err
}
requestID := r.HTTPResponse.Header.Get("X-Qs-Request-Id")
requestID := r.HTTPResponse.Header.Get(http.CanonicalHeaderKey("X-QS-Request-ID"))
x.RequestID = &requestID
return x, err
@ -749,9 +767,13 @@ func (s *Bucket) PutObjectRequest(objectKey string, input *PutObjectInput) (*req
input = &PutObjectInput{}
}
properties := *s.Properties
properties.ObjectKey = &objectKey
o := &data.Operation{
Config: s.Config,
Properties: s.Properties,
Properties: &properties,
APIName: "PUT Object",
RequestMethod: "PUT",
RequestURI: "/<bucket-name>/<object-key>",
@ -760,8 +782,6 @@ func (s *Bucket) PutObjectRequest(objectKey string, input *PutObjectInput) (*req
},
}
s.Properties.ObjectKey = &objectKey
x := &PutObjectOutput{}
r, err := request.New(o, input, x)
if err != nil {
@ -841,7 +861,7 @@ func (s *Bucket) UploadMultipart(objectKey string, input *UploadMultipartInput)
return nil, err
}
requestID := r.HTTPResponse.Header.Get("X-Qs-Request-Id")
requestID := r.HTTPResponse.Header.Get(http.CanonicalHeaderKey("X-QS-Request-ID"))
x.RequestID = &requestID
return x, err
@ -854,9 +874,13 @@ func (s *Bucket) UploadMultipartRequest(objectKey string, input *UploadMultipart
input = &UploadMultipartInput{}
}
properties := *s.Properties
properties.ObjectKey = &objectKey
o := &data.Operation{
Config: s.Config,
Properties: s.Properties,
Properties: &properties,
APIName: "Upload Multipart",
RequestMethod: "PUT",
RequestURI: "/<bucket-name>/<object-key>",
@ -865,8 +889,6 @@ func (s *Bucket) UploadMultipartRequest(objectKey string, input *UploadMultipart
},
}
s.Properties.ObjectKey = &objectKey
x := &UploadMultipartOutput{}
r, err := request.New(o, input, x)
if err != nil {

View File

@ -18,11 +18,15 @@
package service
import (
"net/http"
"github.com/yunify/qingstor-sdk-go/config"
"github.com/yunify/qingstor-sdk-go/request"
"github.com/yunify/qingstor-sdk-go/request/data"
)
var _ http.Header
// Service QingStor provides low-cost and reliable online storage service with unlimited storage space, high read and write performance, high reliability and data safety, fine-grained access control, and easy to use API.
type Service struct {
Config *config.Config
@ -47,7 +51,7 @@ func (s *Service) ListBuckets(input *ListBucketsInput) (*ListBucketsOutput, erro
return nil, err
}
requestID := r.HTTPResponse.Header.Get("X-Qs-Request-Id")
requestID := r.HTTPResponse.Header.Get(http.CanonicalHeaderKey("X-QS-Request-ID"))
x.RequestID = &requestID
return x, err

View File

@ -20,11 +20,15 @@
package service
import (
"net/http"
"github.com/yunify/qingstor-sdk-go/config"
"github.com/yunify/qingstor-sdk-go/request"
"github.com/yunify/qingstor-sdk-go/request/data"
)
var _ http.Header
{{if $service.Description}}// Service {{$service.Description}}{{end}}
type Service struct {
Config *config.Config

View File

@ -153,7 +153,7 @@
return nil, err
}
requestID := r.HTTPResponse.Header.Get("X-Qs-Request-Id")
requestID := r.HTTPResponse.Header.Get(http.CanonicalHeaderKey("X-QS-Request-ID"))
x.RequestID = &requestID
return x, err
@ -186,10 +186,17 @@
{{$uri := replace $uri "}" ">" -1}}
{{$uri := dashConnected $uri}}
{{- if ne $belongs "Service"}}
properties := *s.Properties
{{- end}}
{{if eq $service.Name "Object"}}
properties.ObjectKey = &objectKey
{{end}}
o := &data.Operation{
Config: s.Config,
{{- if ne $belongs "Service"}}
Properties: s.Properties,
Properties: &properties,
{{- end}}
APIName: "{{$operation.Name}}",
RequestMethod: "{{$operation.Request.Method}}",
@ -210,10 +217,6 @@
{{end -}}
}
{{if eq $service.Name "Object"}}
s.Properties.ObjectKey = &objectKey
{{end}}
x := &{{$opID}}Output{}
r, err := request.New(o, {{if $hasInput}}input{{else}}nil{{end}}, x)
if err != nil {

View File

@ -22,6 +22,7 @@ package service
import (
"fmt"
"io"
"net/http"
"time"
"github.com/yunify/qingstor-sdk-go/config"
@ -32,6 +33,7 @@ import (
var _ fmt.State
var _ io.Reader
var _ http.Header
var _ time.Time
var _ config.Config

View File

@ -25,6 +25,7 @@ import (
"net/http"
"os"
"os/exec"
"sync"
"github.com/DATA-DOG/godog"
@ -66,7 +67,9 @@ func ObjectFeatureContext(s *godog.Suite) {
}
// --------------------------------------------------------------------------
var putObjectOutput *qs.PutObjectOutput
const concurrency = 16
var putObjectOutputs [concurrency]*qs.PutObjectOutput
func putObjectWithKey(objectKey string) error {
_, err = exec.Command("dd", "if=/dev/zero", "of=/tmp/sdk_bin", "bs=1024", "count=1").Output()
@ -75,189 +78,557 @@ func putObjectWithKey(objectKey string) error {
}
defer os.Remove("/tmp/sdk_bin")
file, err := os.Open("/tmp/sdk_bin")
if err != nil {
return err
errChan := make(chan error, concurrency)
wg := sync.WaitGroup{}
wg.Add(concurrency)
for i := 0; i < concurrency; i++ {
go func(index int, errChan chan<- error) {
wg.Done()
file, err := os.Open("/tmp/sdk_bin")
if err != nil {
errChan <- err
return
}
defer file.Close()
hash := md5.New()
_, err = io.Copy(hash, file)
if err != nil {
errChan <- err
return
}
hashInBytes := hash.Sum(nil)[:16]
md5String := hex.EncodeToString(hashInBytes)
//file.Seek(0, io.SeekStart)
file.Seek(0, 0)
if len(objectKey) > 1000 {
objectKey = objectKey[:1000]
}
putObjectOutput, err := bucket.PutObject(
fmt.Sprintf("%s-%d", objectKey, index),
&qs.PutObjectInput{
ContentType: qs.String("text/plain"),
ContentMD5: qs.String(md5String),
Body: file,
},
)
if err != nil {
errChan <- err
return
}
putObjectOutputs[index] = putObjectOutput
errChan <- nil
return
}(i, errChan)
}
defer file.Close()
wg.Wait()
hash := md5.New()
_, err = io.Copy(hash, file)
hashInBytes := hash.Sum(nil)[:16]
md5String := hex.EncodeToString(hashInBytes)
//file.Seek(0, io.SeekStart)
file.Seek(0, 0)
putObjectOutput, err = bucket.PutObject(objectKey, &qs.PutObjectInput{
ContentType: qs.String("text/plain"),
ContentMD5: qs.String(md5String),
Body: file,
})
return err
for i := 0; i < concurrency; i++ {
err = <-errChan
if err != nil {
return err
}
}
return nil
}
func putObjectStatusCodeIs(statusCode int) error {
return checkEqual(qs.IntValue(putObjectOutput.StatusCode), statusCode)
for _, output := range putObjectOutputs {
err = checkEqual(qs.IntValue(output.StatusCode), statusCode)
if err != nil {
return err
}
}
return nil
}
// --------------------------------------------------------------------------
var copyObjectOutput *qs.PutObjectOutput
var copyObjectOutputs [concurrency]*qs.PutObjectOutput
func copyObjectWithKey(objectKey string) error {
copyObjectKey := fmt.Sprintf(`%s_copy`, objectKey)
copyObjectOutput, err = bucket.PutObject(copyObjectKey, &qs.PutObjectInput{
XQSCopySource: qs.String(fmt.Sprintf(`/%s/%s`, tc.BucketName, objectKey)),
})
return err
errChan := make(chan error, concurrency)
wg := sync.WaitGroup{}
wg.Add(concurrency)
for i := 0; i < concurrency; i++ {
go func(index int, errChan chan<- error) {
wg.Done()
if len(objectKey) > 1000 {
objectKey = objectKey[:1000]
}
copyObjectOutput, err := bucket.PutObject(
fmt.Sprintf("%s-%d-copy", objectKey, index),
&qs.PutObjectInput{
XQSCopySource: qs.String(
fmt.Sprintf("/%s/%s-%d", tc.BucketName, objectKey, index),
),
})
if err != nil {
errChan <- err
return
}
copyObjectOutputs[index] = copyObjectOutput
errChan <- nil
return
}(i, errChan)
}
wg.Wait()
for i := 0; i < concurrency; i++ {
err = <-errChan
if err != nil {
return err
}
}
return nil
}
func copyObjectStatusCodeIs(statusCode int) error {
return checkEqual(qs.IntValue(copyObjectOutput.StatusCode), statusCode)
for _, output := range copyObjectOutputs {
err = checkEqual(qs.IntValue(output.StatusCode), statusCode)
if err != nil {
return err
}
}
return nil
}
// --------------------------------------------------------------------------
var moveObjectOutput *qs.PutObjectOutput
var moveObjectOutputs [concurrency]*qs.PutObjectOutput
func moveObjectWithKey(objectKey string) error {
copyObjectKey := fmt.Sprintf(`%s_copy`, objectKey)
moveObjectKey := fmt.Sprintf(`%s_move`, objectKey)
moveObjectOutput, err = bucket.PutObject(moveObjectKey, &qs.PutObjectInput{
XQSMoveSource: qs.String(fmt.Sprintf(`/%s/%s`, tc.BucketName, copyObjectKey)),
})
return err
errChan := make(chan error, concurrency)
wg := sync.WaitGroup{}
wg.Add(concurrency)
for i := 0; i < concurrency; i++ {
go func(index int, errChan chan<- error) {
wg.Done()
if len(objectKey) > 1000 {
objectKey = objectKey[:1000]
}
moveObjectOutput, err := bucket.PutObject(
fmt.Sprintf("%s-%d-move", objectKey, index),
&qs.PutObjectInput{
XQSMoveSource: qs.String(
fmt.Sprintf(`/%s/%s-%d-copy`, tc.BucketName, objectKey, index),
),
})
if err != nil {
errChan <- err
return
}
moveObjectOutputs[index] = moveObjectOutput
errChan <- nil
return
}(i, errChan)
}
wg.Wait()
for i := 0; i < concurrency; i++ {
err = <-errChan
if err != nil {
return err
}
}
return nil
}
func moveObjectStatusCodeIs(statusCode int) error {
return checkEqual(qs.IntValue(moveObjectOutput.StatusCode), statusCode)
for _, output := range moveObjectOutputs {
err = checkEqual(qs.IntValue(output.StatusCode), statusCode)
if err != nil {
return err
}
}
return nil
}
// --------------------------------------------------------------------------
var getObjectOutput *qs.GetObjectOutput
var getObjectOutputs [concurrency]*qs.GetObjectOutput
func getObjectWithKey(objectKey string) error {
getObjectOutput, err = bucket.GetObject(objectKey, nil)
return err
errChan := make(chan error, concurrency)
wg := sync.WaitGroup{}
wg.Add(concurrency)
for i := 0; i < concurrency; i++ {
go func(index int, errChan chan<- error) {
wg.Done()
if len(objectKey) > 1000 {
objectKey = objectKey[:1000]
}
getObjectOutput, err := bucket.GetObject(
fmt.Sprintf("%s-%d", objectKey, index), nil,
)
if err != nil {
errChan <- err
return
}
getObjectOutputs[index] = getObjectOutput
errChan <- nil
return
}(i, errChan)
}
wg.Wait()
for i := 0; i < concurrency; i++ {
err = <-errChan
if err != nil {
return err
}
}
return nil
}
func getObjectStatusCodeIs(statusCode int) error {
return checkEqual(qs.IntValue(getObjectOutput.StatusCode), statusCode)
for _, output := range getObjectOutputs {
err = checkEqual(qs.IntValue(output.StatusCode), statusCode)
if err != nil {
return err
}
}
return nil
}
func getObjectContentLengthIs(length int) error {
buffer := &bytes.Buffer{}
buffer.ReadFrom(getObjectOutput.Body)
getObjectOutput.Body.Close()
return checkEqual(len(buffer.Bytes())*1024, length)
for _, output := range getObjectOutputs {
buffer.Truncate(0)
buffer.ReadFrom(output.Body)
err = checkEqual(len(buffer.Bytes())*1024, length)
if err != nil {
return err
}
}
return nil
}
// --------------------------------------------------------------------------
var getObjectWithContentTypeRequest *request.Request
var getObjectWithContentTypeRequests [concurrency]*request.Request
func getObjectWithContentType(objectKey, contentType string) error {
getObjectWithContentTypeRequest, _, err = bucket.GetObjectRequest(
objectKey,
&qs.GetObjectInput{
ResponseContentType: qs.String(contentType),
},
)
if err != nil {
return err
errChan := make(chan error, concurrency)
wg := sync.WaitGroup{}
wg.Add(concurrency)
for i := 0; i < concurrency; i++ {
go func(index int, errChan chan<- error) {
wg.Done()
if len(objectKey) > 1000 {
objectKey = objectKey[:1000]
}
getObjectWithContentTypeRequest, _, err := bucket.GetObjectRequest(
fmt.Sprintf("%s-%d", objectKey, index),
&qs.GetObjectInput{
ResponseContentType: qs.String(contentType),
},
)
if err != nil {
errChan <- err
return
}
err = getObjectWithContentTypeRequest.Send()
if err != nil {
errChan <- err
return
}
err = getObjectWithContentTypeRequest.Send()
if err != nil {
errChan <- err
return
}
getObjectWithContentTypeRequests[index] = getObjectWithContentTypeRequest
errChan <- nil
return
}(i, errChan)
}
err = getObjectWithContentTypeRequest.Send()
if err != nil {
return err
wg.Wait()
for i := 0; i < concurrency; i++ {
err = <-errChan
if err != nil {
return err
}
}
return nil
}
func getObjectContentTypeIs(contentType string) error {
return checkEqual(getObjectWithContentTypeRequest.HTTPResponse.Header.Get("Content-Type"), contentType)
for _, r := range getObjectWithContentTypeRequests {
err = checkEqual(r.HTTPResponse.Header.Get("Content-Type"), contentType)
if err != nil {
return err
}
}
return nil
}
// --------------------------------------------------------------------------
var getObjectWithQuerySignatureURL string
var getObjectWithQuerySignatureURLs [concurrency]string
func getObjectWithQuerySignature(objectKey string) error {
r, _, err := bucket.GetObjectRequest(objectKey, nil)
if err != nil {
return err
}
errChan := make(chan error, concurrency)
err = r.SignQuery(10)
if err != nil {
return err
}
wg := sync.WaitGroup{}
wg.Add(concurrency)
for i := 0; i < concurrency; i++ {
go func(index int, errChan chan<- error) {
wg.Done()
getObjectWithQuerySignatureURL = r.HTTPRequest.URL.String()
if len(objectKey) > 1000 {
objectKey = objectKey[:1000]
}
r, _, err := bucket.GetObjectRequest(
fmt.Sprintf("%s-%d", objectKey, index), nil,
)
if err != nil {
errChan <- err
return
}
err = r.SignQuery(10)
if err != nil {
errChan <- err
return
}
getObjectWithQuerySignatureURLs[index] = r.HTTPRequest.URL.String()
errChan <- nil
return
}(i, errChan)
}
wg.Wait()
for i := 0; i < concurrency; i++ {
err = <-errChan
if err != nil {
return err
}
}
return nil
}
func getObjectWithQuerySignatureContentLengthIs(length int) error {
out, err := http.Get(getObjectWithQuerySignatureURL)
if err != nil {
return err
}
buffer := &bytes.Buffer{}
buffer.ReadFrom(out.Body)
out.Body.Close()
return checkEqual(len(buffer.Bytes())*1024, length)
for _, url := range getObjectWithQuerySignatureURLs {
out, err := http.Get(url)
if err != nil {
return err
}
buffer.Truncate(0)
buffer.ReadFrom(out.Body)
out.Body.Close()
err = checkEqual(len(buffer.Bytes())*1024, length)
if err != nil {
return err
}
}
return nil
}
// --------------------------------------------------------------------------
var headObjectOutput *qs.HeadObjectOutput
var headObjectOutputs [concurrency]*qs.HeadObjectOutput
func headObjectWithKey(objectKey string) error {
headObjectOutput, err = bucket.HeadObject(objectKey, nil)
return err
errChan := make(chan error, concurrency)
wg := sync.WaitGroup{}
wg.Add(concurrency)
for i := 0; i < concurrency; i++ {
go func(index int, errChan chan<- error) {
wg.Done()
if len(objectKey) > 1000 {
objectKey = objectKey[:1000]
}
headObjectOutput, err := bucket.HeadObject(
fmt.Sprintf("%s-%d", objectKey, index), nil,
)
if err != nil {
errChan <- err
return
}
headObjectOutputs[index] = headObjectOutput
errChan <- nil
return
}(i, errChan)
}
wg.Wait()
for i := 0; i < concurrency; i++ {
err = <-errChan
if err != nil {
return err
}
}
return nil
}
func headObjectStatusCodeIs(statusCode int) error {
return checkEqual(qs.IntValue(headObjectOutput.StatusCode), statusCode)
for _, output := range headObjectOutputs {
err = checkEqual(qs.IntValue(output.StatusCode), statusCode)
if err != nil {
return err
}
}
return nil
}
// --------------------------------------------------------------------------
var optionsObjectOutput *qs.OptionsObjectOutput
var optionsObjectOutputs [concurrency]*qs.OptionsObjectOutput
func optionsObjectWithMethodAndOrigin(objectKey, method, origin string) error {
optionsObjectOutput, err = bucket.OptionsObject(
objectKey,
&qs.OptionsObjectInput{
AccessControlRequestMethod: qs.String(method),
Origin: qs.String(origin),
},
)
return err
errChan := make(chan error, concurrency)
wg := sync.WaitGroup{}
wg.Add(concurrency)
for i := 0; i < concurrency; i++ {
go func(index int, errChan chan<- error) {
wg.Done()
if len(objectKey) > 1000 {
objectKey = objectKey[:1000]
}
optionsObjectOutput, err := bucket.OptionsObject(
fmt.Sprintf("%s-%d", objectKey, index),
&qs.OptionsObjectInput{
AccessControlRequestMethod: qs.String(method),
Origin: qs.String(origin),
},
)
if err != nil {
errChan <- err
return
}
optionsObjectOutputs[index] = optionsObjectOutput
errChan <- nil
return
}(i, errChan)
}
wg.Wait()
for i := 0; i < concurrency; i++ {
err = <-errChan
if err != nil {
return err
}
}
return nil
}
func optionsObjectStatusCodeIs(statusCode int) error {
return checkEqual(qs.IntValue(optionsObjectOutput.StatusCode), statusCode)
for _, output := range optionsObjectOutputs {
err = checkEqual(qs.IntValue(output.StatusCode), statusCode)
if err != nil {
return err
}
}
return nil
}
// --------------------------------------------------------------------------
var deleteObjectOutput *qs.DeleteObjectOutput
var deleteTheMoveObjectOutput *qs.DeleteObjectOutput
var deleteObjectOutputs [concurrency]*qs.DeleteObjectOutput
var deleteTheMoveObjectOutputs [concurrency]*qs.DeleteObjectOutput
func deleteObjectWithKey(objectKey string) error {
deleteObjectOutput, err = bucket.DeleteObject(objectKey)
return err
errChan := make(chan error, concurrency)
wg := sync.WaitGroup{}
wg.Add(concurrency)
for i := 0; i < concurrency; i++ {
go func(index int, errChan chan<- error) {
wg.Done()
if len(objectKey) > 1000 {
objectKey = objectKey[:1000]
}
deleteObjectOutput, err := bucket.DeleteObject(
fmt.Sprintf("%s-%d", objectKey, index),
)
if err != nil {
errChan <- err
return
}
deleteObjectOutputs[index] = deleteObjectOutput
errChan <- nil
return
}(i, errChan)
}
wg.Wait()
for i := 0; i < concurrency; i++ {
err = <-errChan
if err != nil {
return err
}
}
return nil
}
func deleteObjectStatusCodeIs(statusCode int) error {
return checkEqual(qs.IntValue(deleteObjectOutput.StatusCode), statusCode)
for _, output := range deleteObjectOutputs {
err = checkEqual(qs.IntValue(output.StatusCode), statusCode)
if err != nil {
return err
}
}
return nil
}
func deleteTheMoveObjectWithKey(objectKey string) error {
deleteTheMoveObjectOutput, err = bucket.DeleteObject(fmt.Sprintf(`%s_move`, objectKey))
return err
errChan := make(chan error, concurrency)
wg := sync.WaitGroup{}
wg.Add(concurrency)
for i := 0; i < concurrency; i++ {
go func(index int, errChan chan<- error) {
wg.Done()
if len(objectKey) > 1000 {
objectKey = objectKey[:1000]
}
deleteTheMoveObjectOutput, err := bucket.DeleteObject(
fmt.Sprintf("%s-%d-move", objectKey, index),
)
if err != nil {
errChan <- err
return
}
deleteTheMoveObjectOutputs[index] = deleteTheMoveObjectOutput
errChan <- nil
return
}(i, errChan)
}
wg.Wait()
for i := 0; i < concurrency; i++ {
err = <-errChan
if err != nil {
return err
}
}
return nil
}
func deleteTheMoveObjectStatusCodeIs(statusCode int) error {
return checkEqual(qs.IntValue(deleteTheMoveObjectOutput.StatusCode), statusCode)
for _, output := range deleteTheMoveObjectOutputs {
err = checkEqual(qs.IntValue(output.StatusCode), statusCode)
if err != nil {
return err
}
}
return nil
}

View File

@ -20,4 +20,4 @@
package sdk
// Version number.
const Version = "2.2.5"
const Version = "2.2.6"