MCPcopy
hub / github.com/cubefs/cubefs / getObjectHandler

Method getObjectHandler

objectnode/api_handler_object.go:45–313  ·  view source on GitHub ↗

Get object API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html

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

Source from the content-addressed store, hash-verified

43// Get object
44// API reference: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html
45func (o *ObjectNode) getObjectHandler(w http.ResponseWriter, r *http.Request) {
46 var (
47 err error
48 errorCode *ErrorCode
49 )
50
51 span := trace.SpanFromContextSafe(r.Context())
52 defer func() {
53 o.errorResponse(w, r, err, errorCode)
54 }()
55
56 param := ParseRequestParam(r)
57 if param.Bucket() == "" {
58 errorCode = InvalidBucketName
59 return
60 }
61 if param.Object() == "" {
62 errorCode = InvalidKey
63 return
64 }
65 var vol *Volume
66 if vol, err = o.getVol(param.Bucket()); err != nil {
67 log.LogErrorf("getObjectHandler: load volume fail: requestID(%v) volume(%v) path(%v) err(%v)",
68 GetRequestID(r), param.Bucket(), param.Object(), err)
69 return
70 }
71
72 // QPS and Concurrency Limit
73 rateLimit := o.AcquireRateLimiter()
74 if err = rateLimit.AcquireLimitResource(vol.owner, param.apiName); err != nil {
75 return
76 }
77 defer rateLimit.ReleaseLimitResource(vol.owner, param.apiName)
78
79 // parse http range option
80 var (
81 revRange bool
82 isRangeRead bool
83 rangeLower uint64
84 rangeUpper uint64
85 partSize uint64
86 partCount uint64
87 )
88 rangeOpt := strings.TrimSpace(r.Header.Get(Range))
89 if len(rangeOpt) > 0 {
90 if !rangeRegexp.MatchString(rangeOpt) {
91 log.LogErrorf("getObjectHandler: invalid range header: requestID(%v) volume(%v) path(%v) rangeOpt(%v)",
92 GetRequestID(r), param.Bucket(), param.Object(), rangeOpt)
93 errorCode = InvalidRange
94 return
95 }
96 hyphenIndex := strings.Index(rangeOpt, "-")
97 if hyphenIndex < 0 {
98 log.LogErrorf("getObjectHandler: invalid range header: requestID(%v) volume(%v) path(%v) rangeOpt(%v)",
99 GetRequestID(r), param.Bucket(), param.Object(), rangeOpt)
100 errorCode = InvalidRange
101 return
102 }

Callers

nothing calls this directly

Calls 15

errorResponseMethod · 0.95
getVolMethod · 0.95
AcquireRateLimiterMethod · 0.95
ObjectMetaMethod · 0.95
NameMethod · 0.95
readFileMethod · 0.95
SpanFromContextSafeFunction · 0.92
LogErrorfFunction · 0.92
LogDebugfFunction · 0.92
ParseRequestParamFunction · 0.85
GetRequestIDFunction · 0.85
ValidateCacheControlFunction · 0.85

Tested by

no test coverage detected