Post object API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html
(w http.ResponseWriter, r *http.Request)
| 1411 | // Post object |
| 1412 | // API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html |
| 1413 | func (o *ObjectNode) postObjectHandler(w http.ResponseWriter, r *http.Request) { |
| 1414 | var ( |
| 1415 | err error |
| 1416 | errorCode *ErrorCode |
| 1417 | ) |
| 1418 | |
| 1419 | span := trace.SpanFromContextSafe(r.Context()) |
| 1420 | defer func() { |
| 1421 | o.errorResponse(w, r, err, errorCode) |
| 1422 | }() |
| 1423 | |
| 1424 | param := ParseRequestParam(r) |
| 1425 | if param.Bucket() == "" { |
| 1426 | errorCode = InvalidBucketName |
| 1427 | return |
| 1428 | } |
| 1429 | |
| 1430 | var vol *Volume |
| 1431 | if vol, err = o.getVol(param.Bucket()); err != nil { |
| 1432 | log.LogErrorf("postObjectHandler: load volume fail: requestID(%v) volume(%v) err(%v)", |
| 1433 | GetRequestID(r), param.Bucket(), err) |
| 1434 | return |
| 1435 | } |
| 1436 | |
| 1437 | var userInfo *proto.UserInfo |
| 1438 | if userInfo, err = o.getUserInfoByAccessKeyV2(param.AccessKey()); err != nil { |
| 1439 | log.LogErrorf("postObjectHandler: get user info fail: requestID(%v) volume(%v) accessKey(%v) err(%v)", |
| 1440 | GetRequestID(r), param.Bucket(), param.AccessKey(), err) |
| 1441 | return |
| 1442 | } |
| 1443 | |
| 1444 | // qps and concurrency limit |
| 1445 | rateLimit := o.AcquireRateLimiter() |
| 1446 | if err = rateLimit.AcquireLimitResource(vol.owner, param.apiName); err != nil { |
| 1447 | return |
| 1448 | } |
| 1449 | defer rateLimit.ReleaseLimitResource(vol.owner, param.apiName) |
| 1450 | |
| 1451 | // parse the request form |
| 1452 | formReq := NewFormRequest(r) |
| 1453 | if err = formReq.ParseMultipartForm(); err != nil { |
| 1454 | log.LogErrorf("postObjectHandler: parse form fail: requestID(%v) volume(%v) err(%v)", |
| 1455 | GetRequestID(r), param.Bucket(), err) |
| 1456 | errorCode = MalformedPOSTRequest.Copy() |
| 1457 | errorCode.ErrorMessage = fmt.Sprintf("%s (%v)", errorCode.ErrorMessage, err) |
| 1458 | return |
| 1459 | } |
| 1460 | |
| 1461 | // content-md5 check if specified in the request |
| 1462 | requestMD5 := formReq.MultipartFormValue(ContentMD5) |
| 1463 | if requestMD5 != "" { |
| 1464 | decoded, err := base64.StdEncoding.DecodeString(requestMD5) |
| 1465 | if err != nil { |
| 1466 | errorCode = MalformedPOSTRequest.Copy() |
| 1467 | errorCode.ErrorMessage = fmt.Sprintf("%s (%s)", errorCode.ErrorMessage, "Invalid Content-MD5") |
| 1468 | return |
| 1469 | } |
| 1470 | requestMD5 = hex.EncodeToString(decoded) |
nothing calls this directly
no test coverage detected