GetObject fetchs the object from the filesystem.
(ctx context.Context, bucketName, objectName string, rangeRequest *gofakes3.ObjectRangeRequest)
| 145 | |
| 146 | // GetObject fetchs the object from the filesystem. |
| 147 | func (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 |
no test coverage detected