MCPcopy Index your code
hub / github.com/cubefs/cubefs / postObjectHandler

Method postObjectHandler

objectnode/api_handler_object.go:1413–1663  ·  view source on GitHub ↗

Post object API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html

(w http.ResponseWriter, r *http.Request)

Source from the content-addressed store, hash-verified

1411// Post object
1412// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOST.html
1413func (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)

Callers

nothing calls this directly

Calls 15

errorResponseMethod · 0.95
getVolMethod · 0.95
AcquireRateLimiterMethod · 0.95
ParseMultipartFormMethod · 0.95
MultipartFormValueMethod · 0.95
FileNameMethod · 0.95
ValidateMethod · 0.95
FormFileMethod · 0.95
PutObjectMethod · 0.95
NameMethod · 0.95
StringMethod · 0.95

Tested by

no test coverage detected