github.com/qiniu/go-sdk/v7@v7.27.0/storagev2/apis/api_resumable_upload_v1_bput.go (about) 1 // THIS FILE IS GENERATED BY api-generator, DO NOT EDIT DIRECTLY! 2 3 package apis 4 5 import ( 6 "context" 7 "net/http" 8 "strconv" 9 "strings" 10 11 uplog "github.com/qiniu/go-sdk/v7/internal/uplog" 12 resumableuploadv1bput "github.com/qiniu/go-sdk/v7/storagev2/apis/resumable_upload_v1_bput" 13 errors "github.com/qiniu/go-sdk/v7/storagev2/errors" 14 httpclient "github.com/qiniu/go-sdk/v7/storagev2/http_client" 15 utils "github.com/qiniu/go-sdk/v7/storagev2/internal/utils" 16 region "github.com/qiniu/go-sdk/v7/storagev2/region" 17 ) 18 19 type innerResumableUploadV1BputRequest resumableuploadv1bput.Request 20 21 func (request *innerResumableUploadV1BputRequest) getBucketName(ctx context.Context) (string, error) { 22 if request.UpToken != nil { 23 if putPolicy, err := request.UpToken.GetPutPolicy(ctx); err != nil { 24 return "", err 25 } else { 26 return putPolicy.GetBucketName() 27 } 28 } 29 return "", nil 30 } 31 32 func (path *innerResumableUploadV1BputRequest) buildPath() ([]string, error) { 33 allSegments := make([]string, 0, 2) 34 if path.Ctx != "" { 35 allSegments = append(allSegments, path.Ctx) 36 } else { 37 return nil, errors.MissingRequiredFieldError{Name: "Ctx"} 38 } 39 allSegments = append(allSegments, strconv.FormatInt(path.ChunkOffset, 10)) 40 return allSegments, nil 41 } 42 43 func (request *innerResumableUploadV1BputRequest) getAccessKey(ctx context.Context) (string, error) { 44 if request.UpToken != nil { 45 return request.UpToken.GetAccessKey(ctx) 46 } 47 return "", nil 48 } 49 50 type ( 51 ResumableUploadV1BputRequest = resumableuploadv1bput.Request 52 ResumableUploadV1BputResponse = resumableuploadv1bput.Response 53 ) 54 55 // 上传指定块的一片数据,具体数据量可根据现场环境调整,同一块的每片数据必须串行上传 56 func (storage *Storage) ResumableUploadV1Bput(ctx context.Context, request *ResumableUploadV1BputRequest, options *Options) (*ResumableUploadV1BputResponse, error) { 57 if options == nil { 58 options = &Options{} 59 } 60 innerRequest := (*innerResumableUploadV1BputRequest)(request) 61 serviceNames := []region.ServiceName{region.ServiceUp} 62 if innerRequest.UpToken == nil { 63 return nil, errors.MissingRequiredFieldError{Name: "UpToken"} 64 } 65 pathSegments := make([]string, 0, 3) 66 pathSegments = append(pathSegments, "bput") 67 if segments, err := innerRequest.buildPath(); err != nil { 68 return nil, err 69 } else { 70 pathSegments = append(pathSegments, segments...) 71 } 72 path := "/" + strings.Join(pathSegments, "/") 73 var rawQuery string 74 headers := http.Header{} 75 body := innerRequest.Body 76 if body == nil { 77 return nil, errors.MissingRequiredFieldError{Name: "Body"} 78 } 79 hErr := utils.HttpHeadAddContentLength(headers, body) 80 if hErr != nil { 81 return nil, hErr 82 } 83 bucketName := options.OverwrittenBucketName 84 if bucketName == "" { 85 var err error 86 if bucketName, err = innerRequest.getBucketName(ctx); err != nil { 87 return nil, err 88 } 89 } 90 uplogInterceptor, err := uplog.NewRequestUplog("resumableUploadV1Bput", bucketName, "", func() (string, error) { 91 return innerRequest.UpToken.GetUpToken(ctx) 92 }) 93 if err != nil { 94 return nil, err 95 } 96 req := httpclient.Request{Method: "POST", ServiceNames: serviceNames, Path: path, RawQuery: rawQuery, Endpoints: options.OverwrittenEndpoints, Region: options.OverwrittenRegion, Interceptors: []httpclient.Interceptor{uplogInterceptor}, Header: headers, UpToken: innerRequest.UpToken, BufferResponse: true, RequestBody: httpclient.GetRequestBodyFromReadSeekCloser(body), OnRequestProgress: options.OnRequestProgress} 97 if options.OverwrittenEndpoints == nil && options.OverwrittenRegion == nil && storage.client.GetRegions() == nil { 98 bucketHosts := httpclient.DefaultBucketHosts() 99 if bucketName != "" { 100 query := storage.client.GetBucketQuery() 101 if query == nil { 102 if options.OverwrittenBucketHosts != nil { 103 if bucketHosts, err = options.OverwrittenBucketHosts.GetEndpoints(ctx); err != nil { 104 return nil, err 105 } 106 } 107 queryOptions := region.BucketRegionsQueryOptions{UseInsecureProtocol: storage.client.UseInsecureProtocol(), AccelerateUploading: storage.client.AccelerateUploadingEnabled(), HostFreezeDuration: storage.client.GetHostFreezeDuration(), Resolver: storage.client.GetResolver(), Chooser: storage.client.GetChooser(), BeforeResolve: storage.client.GetBeforeResolveCallback(), AfterResolve: storage.client.GetAfterResolveCallback(), ResolveError: storage.client.GetResolveErrorCallback(), BeforeBackoff: storage.client.GetBeforeBackoffCallback(), AfterBackoff: storage.client.GetAfterBackoffCallback(), BeforeRequest: storage.client.GetBeforeRequestCallback(), AfterResponse: storage.client.GetAfterResponseCallback()} 108 if hostRetryConfig := storage.client.GetHostRetryConfig(); hostRetryConfig != nil { 109 queryOptions.RetryMax = hostRetryConfig.RetryMax 110 queryOptions.Backoff = hostRetryConfig.Backoff 111 } 112 if query, err = region.NewBucketRegionsQuery(bucketHosts, &queryOptions); err != nil { 113 return nil, err 114 } 115 } 116 if query != nil { 117 var accessKey string 118 var err error 119 if accessKey, err = innerRequest.getAccessKey(ctx); err != nil { 120 return nil, err 121 } 122 if accessKey == "" { 123 if credentialsProvider := storage.client.GetCredentials(); credentialsProvider != nil { 124 if creds, err := credentialsProvider.Get(ctx); err != nil { 125 return nil, err 126 } else if creds != nil { 127 accessKey = creds.AccessKey 128 } 129 } 130 } 131 if accessKey != "" { 132 req.Region = query.Query(accessKey, bucketName) 133 } 134 } 135 } 136 } 137 var respBody ResumableUploadV1BputResponse 138 if err := storage.client.DoAndAcceptJSON(ctx, &req, &respBody); err != nil { 139 return nil, err 140 } 141 return &respBody, nil 142 }