refactor(thumbnails): thread context.Context through the preprocessor Convert interface

The Tika preview extractor does a network call; it was using context.Background().
Pass the request context from the gRPC handler through Convert so the unpack call
respects cancellation and deadlines. Non-I/O decoders ignore the context.
This commit is contained in:
Dominik Schmidt committed 2026-08-19 18:45:11 +02:00
1 parent c286f771c9
commit 75893c19ee
8 files changed
+40 -34

No files matched your search

@@ -4,6 +4,7 @@ import (
"archive/zip"
"bufio"
"bytes"
"context"
"encoding/base64"
"encoding/json"
"image"
@@ -26,14 +27,14 @@ import (
// FileConverter is the interface for the file converter
type FileConverter interface {
Convert(r io.Reader) (any, error)
Convert(ctx context.Context, r io.Reader) (any, error)
}
// GifDecoder is a converter for the gif file
type GifDecoder struct{}
// Convert reads the gif file and returns the thumbnail image
func (i GifDecoder) Convert(r io.Reader) (any, error) {
func (i GifDecoder) Convert(_ context.Context, r io.Reader) (any, error) {
img, err := gif.DecodeAll(r)
if err != nil {
return nil, errors.Wrap(err, `could not decode the image`)
@@ -45,7 +46,7 @@ func (i GifDecoder) Convert(r io.Reader) (any, error) {
type GgsDecoder struct{ thumbnailpath string }
// Convert reads the ggs file and returns the thumbnail image
func (g GgsDecoder) Convert(r io.Reader) (any, error) {
func (g GgsDecoder) Convert(ctx context.Context, r io.Reader) (any, error) {
var buf bytes.Buffer
_, err := io.Copy(&buf, r)
if err != nil {
@@ -65,7 +66,7 @@ func (g GgsDecoder) Convert(r io.Reader) (any, error) {
if converter == nil {
return nil, thumbnailerErrors.ErrNoConverterForExtractedImageFromGgsFile
}
img, err := converter.Convert(thumbnail)
img, err := converter.Convert(ctx, thumbnail)
if err != nil {
return nil, errors.Wrap(err, `could not decode the image`)
}
@@ -79,7 +80,7 @@ func (g GgsDecoder) Convert(r io.Reader) (any, error) {
type AudioDecoder struct{}
// Convert reads the audio file and extracts the thumbnail image from the id3 tag
func (i AudioDecoder) Convert(r io.Reader) (any, error) {
func (i AudioDecoder) Convert(ctx context.Context, r io.Reader) (any, error) {
b, err := io.ReadAll(r)
if err != nil {
return nil, err
@@ -99,7 +100,7 @@ func (i AudioDecoder) Convert(r io.Reader) (any, error) {
return nil, thumbnailerErrors.ErrNoConverterForExtractedImageFromAudioFile
}
return converter.Convert(bytes.NewReader(picture.Data))
return converter.Convert(ctx, bytes.NewReader(picture.Data))
}
// TxtToImageConverter is a converter for the text file
@@ -108,7 +109,7 @@ type TxtToImageConverter struct {
}
// Convert reads the text file and renders it into a thumbnail image
func (t TxtToImageConverter) Convert(r io.Reader) (any, error) {
func (t TxtToImageConverter) Convert(_ context.Context, r io.Reader) (any, error) {
img := image.NewRGBA(image.Rect(0, 0, 640, 480))
imgBounds := img.Bounds()
@@ -203,7 +204,7 @@ type GGPStruct struct {
type GgpDecoder struct{}
// Convert reads the ggp file and returns the first thumbnail image
func (j GgpDecoder) Convert(r io.Reader) (any, error) {
func (j GgpDecoder) Convert(_ context.Context, r io.Reader) (any, error) {
ggp := &GGPStruct{}
err := json.NewDecoder(r).Decode(ggp)
if err != nil {