check / check (push) Canceled after 0s
The new package internal/imagerequest holds the request type, its two parts Source and Transform, the Format and Fit types, the dimension and fit checks, the /v1/image/ path parsing and the variant key; it imports no other package of pixa. imgcache.ParsedURL, imgcache.ImageRequest, signature.Request, imageprocessor.Request, the second Size, format and fit types and the conversions between them are gone. The image processor takes a Transform only. encurl keeps a private struct with the token's short CBOR field names. VariantKey moves with the function that makes it. Tests follow the moved and renamed code; the tests of the removed conversions go with them. Model: opus-5-5
40 lines
1.1 KiB
Go
40 lines
1.1 KiB
Go
package imagerequest
|
|
|
|
import (
|
|
"crypto/sha256"
|
|
"encoding/hex"
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
// VariantKey is a SHA256 hash identifying a specific image variant (hex-encoded).
|
|
type VariantKey string
|
|
|
|
// CacheKey generates a unique key for a request variant.
|
|
// Format: sha256(host:path:query:width:height:format:quality:fit_mode)
|
|
// The path and query go through escapePercentAndColon, so that a ":" in
|
|
// either cannot be taken for the one between them.
|
|
func CacheKey(req *Request) VariantKey {
|
|
data := fmt.Sprintf("%s:%s:%s:%d:%d:%s:%d:%s",
|
|
req.Source.Host,
|
|
escapePercentAndColon(req.Source.Path),
|
|
escapePercentAndColon(req.Source.Query),
|
|
req.Transform.Size.Width,
|
|
req.Transform.Size.Height,
|
|
req.Transform.Format,
|
|
req.Transform.Quality,
|
|
req.Transform.FitMode,
|
|
)
|
|
h := sha256.Sum256([]byte(data))
|
|
|
|
return VariantKey(hex.EncodeToString(h[:]))
|
|
}
|
|
|
|
// escapePercentAndColon returns s with each "%" written as "%25" and each
|
|
// ":" as "%3A", so that the result holds no ":".
|
|
func escapePercentAndColon(s string) string {
|
|
s = strings.ReplaceAll(s, "%", "%25")
|
|
|
|
return strings.ReplaceAll(s, ":", "%3A")
|
|
}
|