Upload part copy Uploads a part in a multipart upload by copying a existed object. API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html .
(w http.ResponseWriter, r *http.Request)
| 277 | // Uploads a part in a multipart upload by copying a existed object. |
| 278 | // API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html . |
| 279 | func (o *ObjectNode) uploadPartCopyHandler(w http.ResponseWriter, r *http.Request) { |
| 280 | var ( |
| 281 | err error |
| 282 | errorCode *ErrorCode |
| 283 | ) |
| 284 | |
| 285 | span := trace.SpanFromContextSafe(r.Context()) |
| 286 | defer func() { |
| 287 | o.errorResponse(w, r, err, errorCode) |
| 288 | }() |
| 289 | |
| 290 | // step1: check args |
| 291 | param := ParseRequestParam(r) |
| 292 | uploadId := param.GetVar(ParamUploadId) |
| 293 | partNumber := param.GetVar(ParamPartNumber) |
| 294 | if uploadId == "" || partNumber == "" { |
| 295 | log.LogErrorf("uploadPartCopyHandler: illegal uploadID or partNumber, requestID(%v)", GetRequestID(r)) |
| 296 | errorCode = InvalidArgument |
| 297 | return |
| 298 | } |
| 299 | var partNumberInt uint16 |
| 300 | if partNumberInt, err = safeConvertStrToUint16(partNumber); err != nil { |
| 301 | log.LogErrorf("uploadPartCopyHandler: parse part number fail, requestID(%v) raw(%v) err(%v)", |
| 302 | GetRequestID(r), partNumber, err) |
| 303 | errorCode = InvalidPartNumber |
| 304 | return |
| 305 | } |
| 306 | if partNumberInt < uint16(MinPartNumberValid) || partNumberInt > uint16(MaxPartNumberValid) { |
| 307 | errorCode = InvalidPartNumber |
| 308 | return |
| 309 | } |
| 310 | |
| 311 | if param.Bucket() == "" { |
| 312 | errorCode = InvalidBucketName |
| 313 | return |
| 314 | } |
| 315 | if param.Object() == "" { |
| 316 | errorCode = InvalidKey |
| 317 | return |
| 318 | } |
| 319 | var vol *Volume |
| 320 | if vol, err = o.getVol(param.Bucket()); err != nil { |
| 321 | log.LogErrorf("uploadPartCopyHandler: load volume fail: requestID(%v) volume(%v) err(%v)", |
| 322 | GetRequestID(r), param.Bucket(), err) |
| 323 | return |
| 324 | } |
| 325 | |
| 326 | // QPS and Concurrency Limit |
| 327 | rateLimit := o.AcquireRateLimiter() |
| 328 | if err = rateLimit.AcquireLimitResource(vol.owner, param.apiName); err != nil { |
| 329 | return |
| 330 | } |
| 331 | defer rateLimit.ReleaseLimitResource(vol.owner, param.apiName) |
| 332 | |
| 333 | // step2: extract params from req |
| 334 | srcBucket, srcObject, _, err := extractSrcBucketKey(r) |
| 335 | if err != nil { |
| 336 | log.LogDebugf("uploadPartCopyHandler: copySource(%v) argument invalid: requestID(%v)", |
nothing calls this directly
no test coverage detected