Put object API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html
(w http.ResponseWriter, r *http.Request)
| 1242 | // Put object |
| 1243 | // API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html |
| 1244 | func (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 |
nothing calls this directly
no test coverage detected