MCPcopy Create free account
hub / github.com/OpenListTeam/OpenList / GetObject

Method GetObject

server/s3/backend.go:147–221  ·  view source on GitHub ↗

GetObject fetchs the object from the filesystem.

(ctx context.Context, bucketName, objectName string, rangeRequest *gofakes3.ObjectRangeRequest)

Source from the content-addressed store, hash-verified

145
146// GetObject fetchs the object from the filesystem.
147func (b *s3Backend) GetObject(ctx context.Context, bucketName, objectName string, rangeRequest *gofakes3.ObjectRangeRequest) (s3Obj *gofakes3.Object, err error) {
148 bucket, err := getBucketByName(bucketName)
149 if err != nil {
150 return nil, err
151 }
152 bucketPath := bucket.Path
153
154 fp := path.Join(bucketPath, objectName)
155 fmeta, _ := op.GetNearestMeta(fp)
156 node, err := fs.Get(context.WithValue(ctx, conf.MetaKey, fmeta), fp, &fs.GetArgs{})
157 if err != nil {
158 return nil, gofakes3.KeyNotFound(objectName)
159 }
160
161 if node.IsDir() {
162 return nil, gofakes3.KeyNotFound(objectName)
163 }
164
165 link, file, err := fs.Link(ctx, fp, model.LinkArgs{})
166 if err != nil {
167 return nil, err
168 }
169 defer func() {
170 if s3Obj == nil {
171 _ = link.Close()
172 }
173 }()
174
175 size := link.ContentLength
176 if size <= 0 {
177 size = file.GetSize()
178 }
179 rnge, err := rangeRequest.Range(size)
180 if err != nil {
181 return nil, err
182 }
183
184 rrf, err := stream.GetRangeReaderFromLink(size, link)
185 if err != nil {
186 return nil, fmt.Errorf("the remote storage driver need to be enhanced to support s3")
187 }
188
189 var rd io.Reader
190 if rnge != nil {
191 rd, err = rrf.RangeRead(ctx, http_range.Range(*rnge))
192 } else {
193 rd, err = rrf.RangeRead(ctx, http_range.Range{Length: -1})
194 }
195 if err != nil {
196 return nil, err
197 }
198
199 meta := map[string]string{
200 "Last-Modified": node.ModTime().Format(timeFormat),
201 "Content-Disposition": utils.GenerateContentDisposition(file.GetName()),
202 "Content-Type": utils.GetMimeType(fp),
203 }
204

Callers 1

CopyObjectMethod · 0.95

Calls 15

GetNearestMetaFunction · 0.92
GetFunction · 0.92
LinkFunction · 0.92
GetRangeReaderFromLinkFunction · 0.92
RangeStruct · 0.92
GetMimeTypeFunction · 0.92
getBucketByNameFunction · 0.85
RangeMethod · 0.80
IsDirMethod · 0.65
CloseMethod · 0.65
GetSizeMethod · 0.65

Tested by

no test coverage detected