|
- // Copyright 2019 Huawei Technologies Co.,Ltd.
- // Licensed under the Apache License, Version 2.0 (the "License"); you may not use
- // this file except in compliance with the License. You may obtain a copy of the
- // License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software distributed
- // under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
- // CONDITIONS OF ANY KIND, either express or implied. See the License for the
- // specific language governing permissions and limitations under the License.
-
- //nolint:golint, unused
- package obs
-
- import (
- "errors"
- "fmt"
- "github.com/unknwon/com"
- "io"
- "net/http"
- "os"
- "strings"
- "time"
- )
-
- // CreateSignedUrl creates signed url with the specified CreateSignedUrlInput, and returns the CreateSignedUrlOutput and error
- func (obsClient ObsClient) CreateSignedUrl(input *CreateSignedUrlInput) (output *CreateSignedUrlOutput, err error) {
- if input == nil {
- return nil, errors.New("CreateSignedUrlInput is nil")
- }
-
- params := make(map[string]string, len(input.QueryParams))
- for key, value := range input.QueryParams {
- params[key] = value
- }
-
- if input.SubResource != "" {
- params[string(input.SubResource)] = ""
- }
-
- headers := make(map[string][]string, len(input.Headers))
- for key, value := range input.Headers {
- headers[key] = []string{value}
- }
-
- if input.Expires <= 0 {
- input.Expires = 300
- }
-
- requestURL, err := obsClient.doAuthTemporary(string(input.Method), input.Bucket, input.Key, params, headers, int64(input.Expires))
- if err != nil {
- return nil, err
- }
-
- output = &CreateSignedUrlOutput{
- SignedUrl: requestURL,
- ActualSignedRequestHeaders: headers,
- }
- return
- }
-
- func (obsClient ObsClient) isSecurityToken(params map[string]string) {
- if obsClient.conf.securityProvider.securityToken != "" {
- if obsClient.conf.signature == SignatureObs {
- params[HEADER_STS_TOKEN_OBS] = obsClient.conf.securityProvider.securityToken
- } else {
- params[HEADER_STS_TOKEN_AMZ] = obsClient.conf.securityProvider.securityToken
- }
- }
- }
-
- // CreateBrowserBasedSignature gets the browser based signature with the specified CreateBrowserBasedSignatureInput,
- // and returns the CreateBrowserBasedSignatureOutput and error
- func (obsClient ObsClient) CreateBrowserBasedSignature(input *CreateBrowserBasedSignatureInput) (output *CreateBrowserBasedSignatureOutput, err error) {
- if input == nil {
- return nil, errors.New("CreateBrowserBasedSignatureInput is nil")
- }
-
- params := make(map[string]string, len(input.FormParams))
- for key, value := range input.FormParams {
- params[key] = value
- }
-
- date := time.Now().UTC()
- shortDate := date.Format(SHORT_DATE_FORMAT)
- longDate := date.Format(LONG_DATE_FORMAT)
-
- credential, _ := getCredential(obsClient.conf.securityProvider.ak, obsClient.conf.region, shortDate)
-
- if input.Expires <= 0 {
- input.Expires = 300
- }
-
- expiration := date.Add(time.Second * time.Duration(input.Expires)).Format(ISO8601_DATE_FORMAT)
- if obsClient.conf.signature == SignatureV4 {
- params[PARAM_ALGORITHM_AMZ_CAMEL] = V4_HASH_PREFIX
- params[PARAM_CREDENTIAL_AMZ_CAMEL] = credential
- params[PARAM_DATE_AMZ_CAMEL] = longDate
- }
-
- obsClient.isSecurityToken(params)
-
- matchAnyBucket := true
- matchAnyKey := true
- count := 5
- if bucket := strings.TrimSpace(input.Bucket); bucket != "" {
- params["bucket"] = bucket
- matchAnyBucket = false
- count--
- }
-
- if key := strings.TrimSpace(input.Key); key != "" {
- params["key"] = key
- matchAnyKey = false
- count--
- }
-
- originPolicySlice := make([]string, 0, len(params)+count)
- originPolicySlice = append(originPolicySlice, fmt.Sprintf("{\"expiration\":\"%s\",", expiration))
- originPolicySlice = append(originPolicySlice, "\"conditions\":[")
- for key, value := range params {
- if _key := strings.TrimSpace(strings.ToLower(key)); _key != "" {
- originPolicySlice = append(originPolicySlice, fmt.Sprintf("{\"%s\":\"%s\"},", _key, value))
- }
- }
-
- if matchAnyBucket {
- originPolicySlice = append(originPolicySlice, "[\"starts-with\", \"$bucket\", \"\"],")
- }
-
- if matchAnyKey {
- originPolicySlice = append(originPolicySlice, "[\"starts-with\", \"$key\", \"\"],")
- }
-
- originPolicySlice = append(originPolicySlice, "]}")
-
- originPolicy := strings.Join(originPolicySlice, "")
- policy := Base64Encode([]byte(originPolicy))
- var signature string
- if obsClient.conf.signature == SignatureV4 {
- signature = getSignature(policy, obsClient.conf.securityProvider.sk, obsClient.conf.region, shortDate)
- } else {
- signature = Base64Encode(HmacSha1([]byte(obsClient.conf.securityProvider.sk), []byte(policy)))
- }
-
- output = &CreateBrowserBasedSignatureOutput{
- OriginPolicy: originPolicy,
- Policy: policy,
- Algorithm: params[PARAM_ALGORITHM_AMZ_CAMEL],
- Credential: params[PARAM_CREDENTIAL_AMZ_CAMEL],
- Date: params[PARAM_DATE_AMZ_CAMEL],
- Signature: signature,
- }
- return
- }
-
- // ListBucketsWithSignedUrl lists buckets with the specified signed url and signed request headers
- func (obsClient ObsClient) ListBucketsWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *ListBucketsOutput, err error) {
- output = &ListBucketsOutput{}
- err = obsClient.doHTTPWithSignedURL("ListBuckets", HTTP_GET, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // CreateBucketWithSignedUrl creates bucket with the specified signed url and signed request headers and data
- func (obsClient ObsClient) CreateBucketWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header, data io.Reader) (output *BaseModel, err error) {
- output = &BaseModel{}
- err = obsClient.doHTTPWithSignedURL("CreateBucket", HTTP_PUT, signedUrl, actualSignedRequestHeaders, data, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // DeleteBucketWithSignedUrl deletes bucket with the specified signed url and signed request headers
- func (obsClient ObsClient) DeleteBucketWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *BaseModel, err error) {
- output = &BaseModel{}
- err = obsClient.doHTTPWithSignedURL("DeleteBucket", HTTP_DELETE, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // SetBucketStoragePolicyWithSignedUrl sets bucket storage class with the specified signed url and signed request headers and data
- func (obsClient ObsClient) SetBucketStoragePolicyWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header, data io.Reader) (output *BaseModel, err error) {
- output = &BaseModel{}
- err = obsClient.doHTTPWithSignedURL("SetBucketStoragePolicy", HTTP_PUT, signedUrl, actualSignedRequestHeaders, data, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // GetBucketStoragePolicyWithSignedUrl gets bucket storage class with the specified signed url and signed request headers
- func (obsClient ObsClient) GetBucketStoragePolicyWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *GetBucketStoragePolicyOutput, err error) {
- output = &GetBucketStoragePolicyOutput{}
- err = obsClient.doHTTPWithSignedURL("GetBucketStoragePolicy", HTTP_GET, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // ListObjectsWithSignedUrl lists objects in a bucket with the specified signed url and signed request headers
- func (obsClient ObsClient) ListObjectsWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *ListObjectsOutput, err error) {
- output = &ListObjectsOutput{}
- err = obsClient.doHTTPWithSignedURL("ListObjects", HTTP_GET, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- } else {
- if location, ok := output.ResponseHeaders[HEADER_BUCKET_REGION]; ok {
- output.Location = location[0]
- }
- }
- return
- }
-
- // ListVersionsWithSignedUrl lists versioning objects in a bucket with the specified signed url and signed request headers
- func (obsClient ObsClient) ListVersionsWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *ListVersionsOutput, err error) {
- output = &ListVersionsOutput{}
- err = obsClient.doHTTPWithSignedURL("ListVersions", HTTP_GET, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- } else {
- if location, ok := output.ResponseHeaders[HEADER_BUCKET_REGION]; ok {
- output.Location = location[0]
- }
- }
- return
- }
-
- // ListMultipartUploadsWithSignedUrl lists the multipart uploads that are initialized but not combined or aborted in a
- // specified bucket with the specified signed url and signed request headers
- func (obsClient ObsClient) ListMultipartUploadsWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *ListMultipartUploadsOutput, err error) {
- output = &ListMultipartUploadsOutput{}
- err = obsClient.doHTTPWithSignedURL("ListMultipartUploads", HTTP_GET, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // SetBucketQuotaWithSignedUrl sets the bucket quota with the specified signed url and signed request headers and data
- func (obsClient ObsClient) SetBucketQuotaWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header, data io.Reader) (output *BaseModel, err error) {
- output = &BaseModel{}
- err = obsClient.doHTTPWithSignedURL("SetBucketQuota", HTTP_PUT, signedUrl, actualSignedRequestHeaders, data, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // GetBucketQuotaWithSignedUrl gets the bucket quota with the specified signed url and signed request headers
- func (obsClient ObsClient) GetBucketQuotaWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *GetBucketQuotaOutput, err error) {
- output = &GetBucketQuotaOutput{}
- err = obsClient.doHTTPWithSignedURL("GetBucketQuota", HTTP_GET, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // HeadBucketWithSignedUrl checks whether a bucket exists with the specified signed url and signed request headers
- func (obsClient ObsClient) HeadBucketWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *BaseModel, err error) {
- output = &BaseModel{}
- err = obsClient.doHTTPWithSignedURL("HeadBucket", HTTP_HEAD, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // HeadObjectWithSignedUrl checks whether an object exists with the specified signed url and signed request headers
- func (obsClient ObsClient) HeadObjectWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *BaseModel, err error) {
- output = &BaseModel{}
- err = obsClient.doHTTPWithSignedURL("HeadObject", HTTP_HEAD, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // GetBucketMetadataWithSignedUrl gets the metadata of a bucket with the specified signed url and signed request headers
- func (obsClient ObsClient) GetBucketMetadataWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *GetBucketMetadataOutput, err error) {
- output = &GetBucketMetadataOutput{}
- err = obsClient.doHTTPWithSignedURL("GetBucketMetadata", HTTP_HEAD, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- } else {
- ParseGetBucketMetadataOutput(output)
- }
- return
- }
-
- // GetBucketStorageInfoWithSignedUrl gets storage information about a bucket with the specified signed url and signed request headers
- func (obsClient ObsClient) GetBucketStorageInfoWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *GetBucketStorageInfoOutput, err error) {
- output = &GetBucketStorageInfoOutput{}
- err = obsClient.doHTTPWithSignedURL("GetBucketStorageInfo", HTTP_GET, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // GetBucketLocationWithSignedUrl gets the location of a bucket with the specified signed url and signed request headers
- func (obsClient ObsClient) GetBucketLocationWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *GetBucketLocationOutput, err error) {
- output = &GetBucketLocationOutput{}
- err = obsClient.doHTTPWithSignedURL("GetBucketLocation", HTTP_GET, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // SetBucketAclWithSignedUrl sets the bucket ACL with the specified signed url and signed request headers and data
- func (obsClient ObsClient) SetBucketAclWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header, data io.Reader) (output *BaseModel, err error) {
- output = &BaseModel{}
- err = obsClient.doHTTPWithSignedURL("SetBucketAcl", HTTP_PUT, signedUrl, actualSignedRequestHeaders, data, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // GetBucketAclWithSignedUrl gets the bucket ACL with the specified signed url and signed request headers
- func (obsClient ObsClient) GetBucketAclWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *GetBucketAclOutput, err error) {
- output = &GetBucketAclOutput{}
- err = obsClient.doHTTPWithSignedURL("GetBucketAcl", HTTP_GET, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // SetBucketPolicyWithSignedUrl sets the bucket policy with the specified signed url and signed request headers and data
- func (obsClient ObsClient) SetBucketPolicyWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header, data io.Reader) (output *BaseModel, err error) {
- output = &BaseModel{}
- err = obsClient.doHTTPWithSignedURL("SetBucketPolicy", HTTP_PUT, signedUrl, actualSignedRequestHeaders, data, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // GetBucketPolicyWithSignedUrl gets the bucket policy with the specified signed url and signed request headers
- func (obsClient ObsClient) GetBucketPolicyWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *GetBucketPolicyOutput, err error) {
- output = &GetBucketPolicyOutput{}
- err = obsClient.doHTTPWithSignedURL("GetBucketPolicy", HTTP_GET, signedUrl, actualSignedRequestHeaders, nil, output, false)
- if err != nil {
- output = nil
- }
- return
- }
-
- // DeleteBucketPolicyWithSignedUrl deletes the bucket policy with the specified signed url and signed request headers
- func (obsClient ObsClient) DeleteBucketPolicyWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *BaseModel, err error) {
- output = &BaseModel{}
- err = obsClient.doHTTPWithSignedURL("DeleteBucketPolicy", HTTP_DELETE, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // SetBucketCorsWithSignedUrl sets CORS rules for a bucket with the specified signed url and signed request headers and data
- func (obsClient ObsClient) SetBucketCorsWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header, data io.Reader) (output *BaseModel, err error) {
- output = &BaseModel{}
- err = obsClient.doHTTPWithSignedURL("SetBucketCors", HTTP_PUT, signedUrl, actualSignedRequestHeaders, data, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // GetBucketCorsWithSignedUrl gets CORS rules of a bucket with the specified signed url and signed request headers
- func (obsClient ObsClient) GetBucketCorsWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *GetBucketCorsOutput, err error) {
- output = &GetBucketCorsOutput{}
- err = obsClient.doHTTPWithSignedURL("GetBucketCors", HTTP_GET, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // DeleteBucketCorsWithSignedUrl deletes CORS rules of a bucket with the specified signed url and signed request headers
- func (obsClient ObsClient) DeleteBucketCorsWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *BaseModel, err error) {
- output = &BaseModel{}
- err = obsClient.doHTTPWithSignedURL("DeleteBucketCors", HTTP_DELETE, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // SetBucketVersioningWithSignedUrl sets the versioning status for a bucket with the specified signed url and signed request headers and data
- func (obsClient ObsClient) SetBucketVersioningWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header, data io.Reader) (output *BaseModel, err error) {
- output = &BaseModel{}
- err = obsClient.doHTTPWithSignedURL("SetBucketVersioning", HTTP_PUT, signedUrl, actualSignedRequestHeaders, data, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // GetBucketVersioningWithSignedUrl gets the versioning status of a bucket with the specified signed url and signed request headers
- func (obsClient ObsClient) GetBucketVersioningWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *GetBucketVersioningOutput, err error) {
- output = &GetBucketVersioningOutput{}
- err = obsClient.doHTTPWithSignedURL("GetBucketVersioning", HTTP_GET, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // SetBucketWebsiteConfigurationWithSignedUrl sets website hosting for a bucket with the specified signed url and signed request headers and data
- func (obsClient ObsClient) SetBucketWebsiteConfigurationWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header, data io.Reader) (output *BaseModel, err error) {
- output = &BaseModel{}
- err = obsClient.doHTTPWithSignedURL("SetBucketWebsiteConfiguration", HTTP_PUT, signedUrl, actualSignedRequestHeaders, data, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // GetBucketWebsiteConfigurationWithSignedUrl gets the website hosting settings of a bucket with the specified signed url and signed request headers
- func (obsClient ObsClient) GetBucketWebsiteConfigurationWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *GetBucketWebsiteConfigurationOutput, err error) {
- output = &GetBucketWebsiteConfigurationOutput{}
- err = obsClient.doHTTPWithSignedURL("GetBucketWebsiteConfiguration", HTTP_GET, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // DeleteBucketWebsiteConfigurationWithSignedUrl deletes the website hosting settings of a bucket with the specified signed url and signed request headers
- func (obsClient ObsClient) DeleteBucketWebsiteConfigurationWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *BaseModel, err error) {
- output = &BaseModel{}
- err = obsClient.doHTTPWithSignedURL("DeleteBucketWebsiteConfiguration", HTTP_DELETE, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // SetBucketLoggingConfigurationWithSignedUrl sets the bucket logging with the specified signed url and signed request headers and data
- func (obsClient ObsClient) SetBucketLoggingConfigurationWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header, data io.Reader) (output *BaseModel, err error) {
- output = &BaseModel{}
- err = obsClient.doHTTPWithSignedURL("SetBucketLoggingConfiguration", HTTP_PUT, signedUrl, actualSignedRequestHeaders, data, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // GetBucketLoggingConfigurationWithSignedUrl gets the logging settings of a bucket with the specified signed url and signed request headers
- func (obsClient ObsClient) GetBucketLoggingConfigurationWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *GetBucketLoggingConfigurationOutput, err error) {
- output = &GetBucketLoggingConfigurationOutput{}
- err = obsClient.doHTTPWithSignedURL("GetBucketLoggingConfiguration", HTTP_GET, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // SetBucketLifecycleConfigurationWithSignedUrl sets lifecycle rules for a bucket with the specified signed url and signed request headers and data
- func (obsClient ObsClient) SetBucketLifecycleConfigurationWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header, data io.Reader) (output *BaseModel, err error) {
- output = &BaseModel{}
- err = obsClient.doHTTPWithSignedURL("SetBucketLifecycleConfiguration", HTTP_PUT, signedUrl, actualSignedRequestHeaders, data, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // GetBucketLifecycleConfigurationWithSignedUrl gets lifecycle rules of a bucket with the specified signed url and signed request headers
- func (obsClient ObsClient) GetBucketLifecycleConfigurationWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *GetBucketLifecycleConfigurationOutput, err error) {
- output = &GetBucketLifecycleConfigurationOutput{}
- err = obsClient.doHTTPWithSignedURL("GetBucketLifecycleConfiguration", HTTP_GET, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // DeleteBucketLifecycleConfigurationWithSignedUrl deletes lifecycle rules of a bucket with the specified signed url and signed request headers
- func (obsClient ObsClient) DeleteBucketLifecycleConfigurationWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *BaseModel, err error) {
- output = &BaseModel{}
- err = obsClient.doHTTPWithSignedURL("DeleteBucketLifecycleConfiguration", HTTP_DELETE, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // SetBucketTaggingWithSignedUrl sets bucket tags with the specified signed url and signed request headers and data
- func (obsClient ObsClient) SetBucketTaggingWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header, data io.Reader) (output *BaseModel, err error) {
- output = &BaseModel{}
- err = obsClient.doHTTPWithSignedURL("SetBucketTagging", HTTP_PUT, signedUrl, actualSignedRequestHeaders, data, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // GetBucketTaggingWithSignedUrl gets bucket tags with the specified signed url and signed request headers
- func (obsClient ObsClient) GetBucketTaggingWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *GetBucketTaggingOutput, err error) {
- output = &GetBucketTaggingOutput{}
- err = obsClient.doHTTPWithSignedURL("GetBucketTagging", HTTP_GET, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // DeleteBucketTaggingWithSignedUrl deletes bucket tags with the specified signed url and signed request headers
- func (obsClient ObsClient) DeleteBucketTaggingWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *BaseModel, err error) {
- output = &BaseModel{}
- err = obsClient.doHTTPWithSignedURL("DeleteBucketTagging", HTTP_DELETE, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // SetBucketNotificationWithSignedUrl sets event notification for a bucket with the specified signed url and signed request headers and data
- func (obsClient ObsClient) SetBucketNotificationWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header, data io.Reader) (output *BaseModel, err error) {
- output = &BaseModel{}
- err = obsClient.doHTTPWithSignedURL("SetBucketNotification", HTTP_PUT, signedUrl, actualSignedRequestHeaders, data, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // GetBucketNotificationWithSignedUrl gets event notification settings of a bucket with the specified signed url and signed request headers
- func (obsClient ObsClient) GetBucketNotificationWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *GetBucketNotificationOutput, err error) {
- output = &GetBucketNotificationOutput{}
- err = obsClient.doHTTPWithSignedURL("GetBucketNotification", HTTP_GET, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // DeleteObjectWithSignedUrl deletes an object with the specified signed url and signed request headers
- func (obsClient ObsClient) DeleteObjectWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *DeleteObjectOutput, err error) {
- output = &DeleteObjectOutput{}
- err = obsClient.doHTTPWithSignedURL("DeleteObject", HTTP_DELETE, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- } else {
- ParseDeleteObjectOutput(output)
- }
- return
- }
-
- // DeleteObjectsWithSignedUrl deletes objects in a batch with the specified signed url and signed request headers and data
- func (obsClient ObsClient) DeleteObjectsWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header, data io.Reader) (output *DeleteObjectsOutput, err error) {
- output = &DeleteObjectsOutput{}
- err = obsClient.doHTTPWithSignedURL("DeleteObjects", HTTP_POST, signedUrl, actualSignedRequestHeaders, data, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // SetObjectAclWithSignedUrl sets ACL for an object with the specified signed url and signed request headers and data
- func (obsClient ObsClient) SetObjectAclWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header, data io.Reader) (output *BaseModel, err error) {
- output = &BaseModel{}
- err = obsClient.doHTTPWithSignedURL("SetObjectAcl", HTTP_PUT, signedUrl, actualSignedRequestHeaders, data, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // GetObjectAclWithSignedUrl gets the ACL of an object with the specified signed url and signed request headers
- func (obsClient ObsClient) GetObjectAclWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *GetObjectAclOutput, err error) {
- output = &GetObjectAclOutput{}
- err = obsClient.doHTTPWithSignedURL("GetObjectAcl", HTTP_GET, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- } else {
- if versionID, ok := output.ResponseHeaders[HEADER_VERSION_ID]; ok {
- output.VersionId = versionID[0]
- }
- }
- return
- }
-
- // RestoreObjectWithSignedUrl restores an object with the specified signed url and signed request headers and data
- func (obsClient ObsClient) RestoreObjectWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header, data io.Reader) (output *BaseModel, err error) {
- output = &BaseModel{}
- err = obsClient.doHTTPWithSignedURL("RestoreObject", HTTP_POST, signedUrl, actualSignedRequestHeaders, data, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // GetObjectMetadataWithSignedUrl gets object metadata with the specified signed url and signed request headers
- func (obsClient ObsClient) GetObjectMetadataWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *GetObjectMetadataOutput, err error) {
- output = &GetObjectMetadataOutput{}
- err = obsClient.doHTTPWithSignedURL("GetObjectMetadata", HTTP_HEAD, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- } else {
- ParseGetObjectMetadataOutput(output)
- }
- return
- }
-
- // GetObjectWithSignedUrl downloads object with the specified signed url and signed request headers
- func (obsClient ObsClient) GetObjectWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *GetObjectOutput, err error) {
- output = &GetObjectOutput{}
- err = obsClient.doHTTPWithSignedURL("GetObject", HTTP_GET, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- } else {
- ParseGetObjectOutput(output)
- }
- return
- }
-
- // PutObjectWithSignedUrl uploads an object to the specified bucket with the specified signed url and signed request headers and data
- func (obsClient ObsClient) PutObjectWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header, data io.Reader) (output *PutObjectOutput, err error) {
- output = &PutObjectOutput{}
- err = obsClient.doHTTPWithSignedURL("PutObject", HTTP_PUT, signedUrl, actualSignedRequestHeaders, data, output, true)
- if err != nil {
- output = nil
- } else {
- ParsePutObjectOutput(output)
- }
- return
- }
-
- // PutFileWithSignedUrl uploads a file to the specified bucket with the specified signed url and signed request headers and sourceFile path
- func (obsClient ObsClient) PutFileWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header, sourceFile string) (output *PutObjectOutput, err error) {
- var data io.Reader
- sourceFile = strings.TrimSpace(sourceFile)
- if sourceFile != "" {
- fd, _err := os.Open(sourceFile)
- if _err != nil {
- err = _err
- return nil, err
- }
- defer func() {
- errMsg := fd.Close()
- if errMsg != nil {
- doLog(LEVEL_WARN, "Failed to close file with reason: %v", errMsg)
- }
- }()
-
- stat, _err := fd.Stat()
- if _err != nil {
- err = _err
- return nil, err
- }
- fileReaderWrapper := &fileReaderWrapper{filePath: sourceFile}
- fileReaderWrapper.reader = fd
-
- var contentLength int64
- if value, ok := actualSignedRequestHeaders[HEADER_CONTENT_LENGTH_CAMEL]; ok {
- contentLength = StringToInt64(value[0], -1)
- } else if value, ok := actualSignedRequestHeaders[HEADER_CONTENT_LENGTH]; ok {
- contentLength = StringToInt64(value[0], -1)
- } else {
- contentLength = stat.Size()
- }
- if contentLength > stat.Size() {
- return nil, errors.New("ContentLength is larger than fileSize")
- }
- fileReaderWrapper.totalCount = contentLength
- data = fileReaderWrapper
- }
-
- output = &PutObjectOutput{}
- err = obsClient.doHTTPWithSignedURL("PutObject", HTTP_PUT, signedUrl, actualSignedRequestHeaders, data, output, true)
- if err != nil {
- output = nil
- } else {
- ParsePutObjectOutput(output)
- }
- return
- }
-
- // CopyObjectWithSignedUrl creates a copy for an existing object with the specified signed url and signed request headers
- func (obsClient ObsClient) CopyObjectWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *CopyObjectOutput, err error) {
- output = &CopyObjectOutput{}
- err = obsClient.doHTTPWithSignedURL("CopyObject", HTTP_PUT, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- } else {
- ParseCopyObjectOutput(output)
- }
- return
- }
-
- // AbortMultipartUploadWithSignedUrl aborts a multipart upload in a specified bucket by using the multipart upload ID with the specified signed url and signed request headers
- func (obsClient ObsClient) AbortMultipartUploadWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *BaseModel, err error) {
- output = &BaseModel{}
- err = obsClient.doHTTPWithSignedURL("AbortMultipartUpload", HTTP_DELETE, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // InitiateMultipartUploadWithSignedUrl initializes a multipart upload with the specified signed url and signed request headers
- func (obsClient ObsClient) InitiateMultipartUploadWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *InitiateMultipartUploadOutput, err error) {
- output = &InitiateMultipartUploadOutput{}
- err = obsClient.doHTTPWithSignedURL("InitiateMultipartUpload", HTTP_POST, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- } else {
- ParseInitiateMultipartUploadOutput(output)
- }
- return
- }
-
- // UploadPartWithSignedUrl uploads a part to a specified bucket by using a specified multipart upload ID
- // with the specified signed url and signed request headers and data
- func (obsClient ObsClient) UploadPartWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header, data io.Reader) (output *UploadPartOutput, err error) {
- output = &UploadPartOutput{}
- err = obsClient.doHTTPWithSignedURL("UploadPart", HTTP_PUT, signedUrl, actualSignedRequestHeaders, data, output, true)
- if err != nil {
- output = nil
- } else {
- ParseUploadPartOutput(output)
- }
- return
- }
-
- // CompleteMultipartUploadWithSignedUrl combines the uploaded parts in a specified bucket by using the multipart upload ID
- // with the specified signed url and signed request headers and data
- func (obsClient ObsClient) CompleteMultipartUploadWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header, data io.Reader) (output *CompleteMultipartUploadOutput, err error) {
- output = &CompleteMultipartUploadOutput{}
- err = obsClient.doHTTPWithSignedURL("CompleteMultipartUpload", HTTP_POST, signedUrl, actualSignedRequestHeaders, data, output, true)
- if err != nil {
- output = nil
- } else {
- ParseCompleteMultipartUploadOutput(output)
- }
- return
- }
-
- // ListPartsWithSignedUrl lists the uploaded parts in a bucket by using the multipart upload ID with the specified signed url and signed request headers
- func (obsClient ObsClient) ListPartsWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *ListPartsOutput, err error) {
- output = &ListPartsOutput{}
- err = obsClient.doHTTPWithSignedURL("ListParts", HTTP_GET, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // CopyPartWithSignedUrl copy a part to a specified bucket by using a specified multipart upload ID with the specified signed url and signed request headers
- func (obsClient ObsClient) CopyPartWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *CopyPartOutput, err error) {
- output = &CopyPartOutput{}
- err = obsClient.doHTTPWithSignedURL("CopyPart", HTTP_PUT, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- } else {
- ParseCopyPartOutput(output)
- }
- return
- }
-
- // SetBucketRequestPaymentWithSignedUrl sets requester-pays setting for a bucket with the specified signed url and signed request headers and data
- func (obsClient ObsClient) SetBucketRequestPaymentWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header, data io.Reader) (output *BaseModel, err error) {
- output = &BaseModel{}
- err = obsClient.doHTTPWithSignedURL("SetBucketRequestPayment", HTTP_PUT, signedUrl, actualSignedRequestHeaders, data, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- // GetBucketRequestPaymentWithSignedUrl gets requester-pays setting of a bucket with the specified signed url and signed request headers
- func (obsClient ObsClient) GetBucketRequestPaymentWithSignedUrl(signedUrl string, actualSignedRequestHeaders http.Header) (output *GetBucketRequestPaymentOutput, err error) {
- output = &GetBucketRequestPaymentOutput{}
- err = obsClient.doHTTPWithSignedURL("GetBucketRequestPayment", HTTP_GET, signedUrl, actualSignedRequestHeaders, nil, output, true)
- if err != nil {
- output = nil
- }
- return
- }
-
- func (obsClient ObsClient) CreateUploadPartSignedUrl(bucketName, objectKey, uploadId string, partNumber int, partSize int64) (*http.Request, error) {
- var req *http.Request
-
- input := &UploadPartInput{}
- input.Bucket = bucketName
- input.Key = objectKey
- input.PartNumber = partNumber
- input.UploadId = uploadId
- //input.ContentMD5 = _input.ContentMD5
- //input.SourceFile = _input.SourceFile
- //input.Offset = _input.Offset
- input.PartSize = partSize
- //input.SseHeader = _input.SseHeader
- //input.Body = _input.Body
-
- params, headers, _, err := input.trans(obsClient.conf.signature == SignatureObs)
- if err != nil {
- return req, err
- }
-
- if params == nil {
- params = make(map[string]string)
- }
-
- if headers == nil {
- headers = make(map[string][]string)
- }
-
- var extensions []extensionOptions
- for _, extension := range extensions {
- if extensionHeader, ok := extension.(extensionHeaders); ok {
- _err := extensionHeader(headers, obsClient.conf.signature == SignatureObs)
- if _err != nil {
- doLog(LEVEL_WARN, fmt.Sprintf("set header with error: %v", _err))
- }
- } else {
- doLog(LEVEL_WARN, "Unsupported extensionOptions")
- }
- }
-
- headers["Content-Length"] = []string{com.ToStr(partNumber, 10)}
-
- requestURL, err := obsClient.doAuth(HTTP_PUT, bucketName, objectKey, params, headers, "")
- if err != nil {
- return req, nil
- }
-
- var _data io.Reader
- req, err = http.NewRequest(HTTP_PUT, requestURL, _data)
- if obsClient.conf.ctx != nil {
- req = req.WithContext(obsClient.conf.ctx)
- }
- if err != nil {
- return req, err
- }
-
- if isDebugLogEnabled() {
- auth := headers[HEADER_AUTH_CAMEL]
- delete(headers, HEADER_AUTH_CAMEL)
-
- var isSecurityToken bool
- var securityToken []string
- if securityToken, isSecurityToken = headers[HEADER_STS_TOKEN_AMZ]; isSecurityToken {
- headers[HEADER_STS_TOKEN_AMZ] = []string{"******"}
- } else if securityToken, isSecurityToken = headers[HEADER_STS_TOKEN_OBS]; isSecurityToken {
- headers[HEADER_STS_TOKEN_OBS] = []string{"******"}
- }
- doLog(LEVEL_DEBUG, "Request headers: %v", headers)
- headers[HEADER_AUTH_CAMEL] = auth
- if isSecurityToken {
- if obsClient.conf.signature == SignatureObs {
- headers[HEADER_STS_TOKEN_OBS] = securityToken
- } else {
- headers[HEADER_STS_TOKEN_AMZ] = securityToken
- }
- }
- }
-
- for key, value := range headers {
- if key == HEADER_HOST_CAMEL {
- req.Host = value[0]
- delete(headers, key)
- } else if key == HEADER_CONTENT_LENGTH_CAMEL {
- req.ContentLength = StringToInt64(value[0], -1)
- delete(headers, key)
- } else {
- req.Header[key] = value
- }
- }
-
- var lastRequest *http.Request
- lastRequest = req
-
- req.Header[HEADER_USER_AGENT_CAMEL] = []string{USER_AGENT}
-
- if lastRequest != nil {
- req.Host = lastRequest.Host
- req.ContentLength = lastRequest.ContentLength
- }
-
- return req, nil
- }
|