check / check (push) Canceled after 0s
A cached source and its variants were served until eviction, so a changed image at the same URL was never picked up. Once a source was last checked 24 hours ago, the next request for one of its images asks upstream with If-None-Match and If-Modified-Since, from the ETag and Last-Modified it stored. A 304 renews the source and its variant without a download or a conversion. New bytes replace the source, and each variant made before them is converted again. A failed check serves the cached image and puts the URL in the negative cache. Sources and variants not checked successfully for 30 days are evicted. A variant file's modification time is its source's check time, so a hit still makes no database call. Existing tests change only in call signatures. The test that asserted two-day-old entries are served without asking upstream is replaced by the new ones. Model: opus-5-5
52 lines
1.2 KiB
Go
52 lines
1.2 KiB
Go
package httpfetcher
|
|
|
|
import (
|
|
"context"
|
|
"io"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
"github.com/go-chi/chi/v5/middleware"
|
|
"sneak.berlin/go/pixa/internal/imagerequest"
|
|
)
|
|
|
|
// TestFetchSendsRequestID verifies that a fetch sends the ID of the request
|
|
// it serves, which the RequestID middleware stores in the request context,
|
|
// to the upstream host as X-Request-Id, so the fetch can be found in that
|
|
// host's logs.
|
|
func TestFetchSendsRequestID(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
const requestID = "test-request-id"
|
|
|
|
received := make(chan string, 1)
|
|
|
|
srv := httptest.NewServer(http.HandlerFunc(
|
|
func(w http.ResponseWriter, r *http.Request) {
|
|
received <- r.Header.Get("X-Request-Id")
|
|
|
|
w.Header().Set("Content-Type", imagerequest.FormatJPEG.MIMEType())
|
|
_, _ = io.WriteString(w, imagePayload)
|
|
}))
|
|
t.Cleanup(srv.Close)
|
|
|
|
f, _ := newServerFetcher(t, srv, nil)
|
|
|
|
ctx := context.WithValue(testContext(t), middleware.RequestIDKey, requestID)
|
|
|
|
res, err := f.Fetch(ctx, upstreamSource("/image"), "", "")
|
|
if err != nil {
|
|
t.Fatalf("Fetch() error = %v", err)
|
|
}
|
|
|
|
_ = res.Content.Close()
|
|
|
|
got := <-received
|
|
t.Logf("upstream received X-Request-Id %q", got)
|
|
|
|
if got != requestID {
|
|
t.Errorf("upstream X-Request-Id = %q, want %q", got, requestID)
|
|
}
|
|
}
|