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

Method putObjectHandler

objectnode/api_handler_object.go:1244–1409  ·  view source on GitHub ↗

Put object API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html

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

Source from the content-addressed store, hash-verified

1242// Put object
1243// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html
1244func (o *ObjectNode) putObjectHandler(w http.ResponseWriter, r *http.Request) {
1245 var (
1246 err error
1247 errorCode *ErrorCode
1248 )
1249
1250 span := trace.SpanFromContextSafe(r.Context())
1251 defer func() {
1252 o.errorResponse(w, r, err, errorCode)
1253 }()
1254
1255 param := ParseRequestParam(r)
1256 if param.Bucket() == "" {
1257 errorCode = InvalidBucketName
1258 return
1259 }
1260 if param.Object() == "" {
1261 errorCode = InvalidKey
1262 return
1263 }
1264 if len(param.Object()) > MaxKeyLength {
1265 errorCode = KeyTooLong
1266 return
1267 }
1268 var vol *Volume
1269 if vol, err = o.getVol(param.Bucket()); err != nil {
1270 log.LogErrorf("putObjectHandler: load volume fail: requestID(%v) volume(%v) err(%v)",
1271 GetRequestID(r), param.Bucket(), err)
1272 return
1273 }
1274
1275 // Get request MD5, if request MD5 is not empty, compute and verify it.
1276 requestMD5 := r.Header.Get(ContentMD5)
1277 if requestMD5 != "" {
1278 decoded, err := base64.StdEncoding.DecodeString(requestMD5)
1279 if err != nil {
1280 errorCode = InvalidDigest
1281 return
1282 }
1283 requestMD5 = hex.EncodeToString(decoded)
1284 }
1285
1286 // ObjectLock Config
1287 objetLock, err := vol.metaLoader.loadObjectLock()
1288 if err != nil {
1289 log.LogErrorf("putObjectHandler: load volume objetLock: requestID(%v) volume(%v) err(%v)",
1290 GetRequestID(r), param.Bucket(), err)
1291 return
1292 }
1293 if objetLock != nil && objetLock.ToRetention() != nil && requestMD5 == "" {
1294 errorCode = NoContentMd5HeaderErr
1295 return
1296 }
1297
1298 // QPS and Concurrency Limit
1299 rateLimit := o.AcquireRateLimiter()
1300 if err = rateLimit.AcquireLimitResource(vol.owner, param.apiName); err != nil {
1301 return

Callers

nothing calls this directly

Calls 15

errorResponseMethod · 0.95
getVolMethod · 0.95
AcquireRateLimiterMethod · 0.95
ValidateMethod · 0.95
NameMethod · 0.95
GetOwnerMethod · 0.95
PutObjectMethod · 0.95
SpanFromContextSafeFunction · 0.92
LogErrorfFunction · 0.92
LogInfofFunction · 0.92
ParseRequestParamFunction · 0.85

Tested by

no test coverage detected