check / check (push) Waiting to run
HandleImage parses the path and verifies the signature, and HandleImageEnc decrypts the token. Each then calls serveImage, which chooses the format for auto, gets the image and serves it. respondImageError answers the image service's errors on both routes, and handleImageError is gone. /v1/image/ now answers 504 when the upstream sends no response headers within upstream_fetch_timeout, as README.md documented for /v1/e/. respondImageError logs a 500 at error level and the other answers at warn. The image service alone logs a source refused for its first bytes. A failed write is logged once, at warn, with the request and the bytes served. README.md lists each image route's answers as bullets. Tests send the same errors through both routes. Model: opus-5-5
50 lines
1.5 KiB
Go
50 lines
1.5 KiB
Go
package handlers
|
|
|
|
import (
|
|
"fmt"
|
|
"log/slog"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"strings"
|
|
"testing"
|
|
|
|
"sneak.berlin/go/pixa/internal/httpfetcher"
|
|
"sneak.berlin/go/pixa/internal/imageprocessor"
|
|
"sneak.berlin/go/pixa/internal/imagerequest"
|
|
)
|
|
|
|
// TestUnsupportedSourceFormatAnswers415 checks that respondImageError, which
|
|
// answers the errors of both image routes, answers 415 with a clear error when
|
|
// the upstream answers with a content type pixa does not accept, such as SVG,
|
|
// and when orig is asked of a source in a format the processor cannot name,
|
|
// wrapped as the service wraps them.
|
|
func TestUnsupportedSourceFormatAnswers415(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
h := &Handlers{log: slog.New(slog.DiscardHandler)}
|
|
req := &imagerequest.Request{
|
|
Source: imagerequest.Source{Host: "img.example.com", Path: "/a.svg"},
|
|
}
|
|
|
|
for _, err := range []error{
|
|
fmt.Errorf("upstream fetch failed: %w: image/svg+xml",
|
|
httpfetcher.ErrInvalidContentType),
|
|
fmt.Errorf("image processing failed: %w: unknown",
|
|
imageprocessor.ErrUnsupportedInputFormat),
|
|
} {
|
|
rec := httptest.NewRecorder()
|
|
h.respondImageError(rec, req, err)
|
|
t.Logf("for %v: %d %s", err, rec.Code, rec.Body.String())
|
|
|
|
if rec.Code != http.StatusUnsupportedMediaType {
|
|
t.Errorf("for %v: status = %d, want %d",
|
|
err, rec.Code, http.StatusUnsupportedMediaType)
|
|
}
|
|
|
|
if !strings.Contains(rec.Body.String(), "unsupported source format") {
|
|
t.Errorf("for %v: body = %q, want the unsupported source format error",
|
|
err, rec.Body.String())
|
|
}
|
|
}
|
|
}
|