cached returns a FileReader for the given blobref, which may point to either a blob representing the entire thumbnail (max 16MB) or a file schema blob. The ReadCloser should be closed when done reading.
(ctx context.Context, br blob.Ref)
| 128 | // |
| 129 | // The ReadCloser should be closed when done reading. |
| 130 | func (ih *ImageHandler) cached(ctx context.Context, br blob.Ref) (io.ReadCloser, error) { |
| 131 | rsc, _, err := ih.Cache.Fetch(ctx, br) |
| 132 | if err != nil { |
| 133 | return nil, err |
| 134 | } |
| 135 | slurp, err := io.ReadAll(rsc) |
| 136 | rsc.Close() |
| 137 | if err != nil { |
| 138 | return nil, err |
| 139 | } |
| 140 | // In the common case, when the scaled image itself is less than 16 MB, it's |
| 141 | // all together in one blob. |
| 142 | if strings.HasPrefix(magic.MIMEType(slurp), "image/") { |
| 143 | thumbCacheHitFull.Add(1) |
| 144 | if imageDebug { |
| 145 | log.Printf("Image Cache: hit: %v\n", br) |
| 146 | } |
| 147 | return io.NopCloser(bytes.NewReader(slurp)), nil |
| 148 | } |
| 149 | |
| 150 | // For large scaled images, the cached blob is a file schema blob referencing |
| 151 | // the sub-chunks. |
| 152 | fileBlob, err := schema.BlobFromReader(br, bytes.NewReader(slurp)) |
| 153 | if err != nil { |
| 154 | log.Printf("Failed to parse non-image thumbnail cache blob %v: %v", br, err) |
| 155 | return nil, err |
| 156 | } |
| 157 | fr, err := fileBlob.NewFileReader(ih.Cache) |
| 158 | if err != nil { |
| 159 | log.Printf("cached(%v) NewFileReader = %v", br, err) |
| 160 | return nil, err |
| 161 | } |
| 162 | thumbCacheHitFile.Add(1) |
| 163 | if imageDebug { |
| 164 | log.Printf("Image Cache: fileref hit: %v\n", br) |
| 165 | } |
| 166 | return fr, nil |
| 167 | } |
| 168 | |
| 169 | // Key format: "scaled:" + bref + ":" + width "x" + height |
| 170 | // where bref is the blobref of the unscaled image. |
no test coverage detected