github.com/qiniu/go-sdk/v7@v7.27.0/storagev2/apis/api_fetch_object.go (about) 1 // THIS FILE IS GENERATED BY api-generator, DO NOT EDIT DIRECTLY! 2 3 package apis 4 5 import ( 6 "context" 7 "encoding/base64" 8 "net/http" 9 "strings" 10 "time" 11 12 auth "github.com/qiniu/go-sdk/v7/auth" 13 uplog "github.com/qiniu/go-sdk/v7/internal/uplog" 14 fetchobject "github.com/qiniu/go-sdk/v7/storagev2/apis/fetch_object" 15 errors "github.com/qiniu/go-sdk/v7/storagev2/errors" 16 httpclient "github.com/qiniu/go-sdk/v7/storagev2/http_client" 17 region "github.com/qiniu/go-sdk/v7/storagev2/region" 18 uptoken "github.com/qiniu/go-sdk/v7/storagev2/uptoken" 19 ) 20 21 type innerFetchObjectRequest fetchobject.Request 22 23 func (pp *innerFetchObjectRequest) getBucketName(ctx context.Context) (string, error) { 24 return strings.SplitN(pp.ToEntry, ":", 2)[0], nil 25 } 26 27 func (pp *innerFetchObjectRequest) getObjectName() string { 28 parts := strings.SplitN(pp.ToEntry, ":", 2) 29 if len(parts) > 1 { 30 return parts[1] 31 } 32 return "" 33 } 34 35 func (path *innerFetchObjectRequest) buildPath() ([]string, error) { 36 allSegments := make([]string, 0, 5) 37 if path.FromUrl != "" { 38 allSegments = append(allSegments, base64.URLEncoding.EncodeToString([]byte(path.FromUrl))) 39 } else { 40 return nil, errors.MissingRequiredFieldError{Name: "FromUrl"} 41 } 42 if path.ToEntry != "" { 43 allSegments = append(allSegments, "to", base64.URLEncoding.EncodeToString([]byte(path.ToEntry))) 44 } else { 45 return nil, errors.MissingRequiredFieldError{Name: "ToEntry"} 46 } 47 if path.Host != "" { 48 allSegments = append(allSegments, "host", base64.URLEncoding.EncodeToString([]byte(path.Host))) 49 } 50 return allSegments, nil 51 } 52 53 func (request *innerFetchObjectRequest) getAccessKey(ctx context.Context) (string, error) { 54 if request.Credentials != nil { 55 if credentials, err := request.Credentials.Get(ctx); err != nil { 56 return "", err 57 } else { 58 return credentials.AccessKey, nil 59 } 60 } 61 return "", nil 62 } 63 64 type ( 65 FetchObjectRequest = fetchobject.Request 66 FetchObjectResponse = fetchobject.Response 67 ) 68 69 // 从指定 URL 抓取指定名称的对象并存储到该空间中 70 func (storage *Storage) FetchObject(ctx context.Context, request *FetchObjectRequest, options *Options) (*FetchObjectResponse, error) { 71 if options == nil { 72 options = &Options{} 73 } 74 innerRequest := (*innerFetchObjectRequest)(request) 75 serviceNames := []region.ServiceName{region.ServiceIo} 76 if innerRequest.Credentials == nil && storage.client.GetCredentials() == nil { 77 return nil, errors.MissingRequiredFieldError{Name: "Credentials"} 78 } 79 pathSegments := make([]string, 0, 6) 80 pathSegments = append(pathSegments, "fetch") 81 if segments, err := innerRequest.buildPath(); err != nil { 82 return nil, err 83 } else { 84 pathSegments = append(pathSegments, segments...) 85 } 86 path := "/" + strings.Join(pathSegments, "/") 87 var rawQuery string 88 headers := http.Header{} 89 bucketName := options.OverwrittenBucketName 90 if bucketName == "" { 91 var err error 92 if bucketName, err = innerRequest.getBucketName(ctx); err != nil { 93 return nil, err 94 } 95 } 96 objectName := innerRequest.getObjectName() 97 uplogInterceptor, err := uplog.NewRequestUplog("fetchObject", bucketName, objectName, func() (string, error) { 98 credentials := innerRequest.Credentials 99 if credentials == nil { 100 credentials = storage.client.GetCredentials() 101 } 102 putPolicy, err := uptoken.NewPutPolicy(bucketName, time.Now().Add(time.Hour)) 103 if err != nil { 104 return "", err 105 } 106 return uptoken.NewSigner(putPolicy, credentials).GetUpToken(ctx) 107 }) 108 if err != nil { 109 return nil, err 110 } 111 req := httpclient.Request{Method: "POST", ServiceNames: serviceNames, Path: path, RawQuery: rawQuery, Endpoints: options.OverwrittenEndpoints, Region: options.OverwrittenRegion, Interceptors: []httpclient.Interceptor{uplogInterceptor}, Header: headers, AuthType: auth.TokenQiniu, Credentials: innerRequest.Credentials, BufferResponse: true, OnRequestProgress: options.OnRequestProgress} 112 if options.OverwrittenEndpoints == nil && options.OverwrittenRegion == nil && storage.client.GetRegions() == nil { 113 bucketHosts := httpclient.DefaultBucketHosts() 114 if bucketName != "" { 115 query := storage.client.GetBucketQuery() 116 if query == nil { 117 if options.OverwrittenBucketHosts != nil { 118 if bucketHosts, err = options.OverwrittenBucketHosts.GetEndpoints(ctx); err != nil { 119 return nil, err 120 } 121 } 122 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()} 123 if hostRetryConfig := storage.client.GetHostRetryConfig(); hostRetryConfig != nil { 124 queryOptions.RetryMax = hostRetryConfig.RetryMax 125 queryOptions.Backoff = hostRetryConfig.Backoff 126 } 127 if query, err = region.NewBucketRegionsQuery(bucketHosts, &queryOptions); err != nil { 128 return nil, err 129 } 130 } 131 if query != nil { 132 var accessKey string 133 var err error 134 if accessKey, err = innerRequest.getAccessKey(ctx); err != nil { 135 return nil, err 136 } 137 if accessKey == "" { 138 if credentialsProvider := storage.client.GetCredentials(); credentialsProvider != nil { 139 if creds, err := credentialsProvider.Get(ctx); err != nil { 140 return nil, err 141 } else if creds != nil { 142 accessKey = creds.AccessKey 143 } 144 } 145 } 146 if accessKey != "" { 147 req.Region = query.Query(accessKey, bucketName) 148 } 149 } 150 } 151 } 152 var respBody FetchObjectResponse 153 if err := storage.client.DoAndAcceptJSON(ctx, &req, &respBody); err != nil { 154 return nil, err 155 } 156 return &respBody, nil 157 }