Merge pull request 'fix: propagate AllowHTTP to SourceURL() scheme selection (closes #1)' (#6) from fix/issue-1 into main
Reviewed-on: #6
This commit was merged in pull request #6.
This commit is contained in:
@@ -79,11 +79,18 @@ type ImageRequest struct {
|
|||||||
Signature string
|
Signature string
|
||||||
// Expires is the signature expiration timestamp
|
// Expires is the signature expiration timestamp
|
||||||
Expires time.Time
|
Expires time.Time
|
||||||
|
// AllowHTTP indicates whether HTTP (non-TLS) is allowed for this request
|
||||||
|
AllowHTTP bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// SourceURL returns the full upstream URL to fetch
|
// SourceURL returns the full upstream URL to fetch.
|
||||||
|
// Uses http:// scheme when AllowHTTP is true, otherwise https://.
|
||||||
func (r *ImageRequest) SourceURL() string {
|
func (r *ImageRequest) SourceURL() string {
|
||||||
url := "https://" + r.SourceHost + r.SourcePath
|
scheme := "https"
|
||||||
|
if r.AllowHTTP {
|
||||||
|
scheme = "http"
|
||||||
|
}
|
||||||
|
url := scheme + "://" + r.SourceHost + r.SourcePath
|
||||||
if r.SourceQuery != "" {
|
if r.SourceQuery != "" {
|
||||||
url += "?" + r.SourceQuery
|
url += "?" + r.SourceQuery
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ type Service struct {
|
|||||||
signer *Signer
|
signer *Signer
|
||||||
whitelist *HostWhitelist
|
whitelist *HostWhitelist
|
||||||
log *slog.Logger
|
log *slog.Logger
|
||||||
|
allowHTTP bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// ServiceConfig holds configuration for the image service.
|
// ServiceConfig holds configuration for the image service.
|
||||||
@@ -68,6 +69,11 @@ func NewService(cfg *ServiceConfig) (*Service, error) {
|
|||||||
log = slog.Default()
|
log = slog.Default()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
allowHTTP := false
|
||||||
|
if cfg.FetcherConfig != nil {
|
||||||
|
allowHTTP = cfg.FetcherConfig.AllowHTTP
|
||||||
|
}
|
||||||
|
|
||||||
return &Service{
|
return &Service{
|
||||||
cache: cfg.Cache,
|
cache: cfg.Cache,
|
||||||
fetcher: fetcher,
|
fetcher: fetcher,
|
||||||
@@ -75,6 +81,7 @@ func NewService(cfg *ServiceConfig) (*Service, error) {
|
|||||||
signer: signer,
|
signer: signer,
|
||||||
whitelist: NewHostWhitelist(cfg.Whitelist),
|
whitelist: NewHostWhitelist(cfg.Whitelist),
|
||||||
log: log,
|
log: log,
|
||||||
|
allowHTTP: allowHTTP,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -83,6 +90,9 @@ var ErrNegativeCached = errors.New("request is in negative cache (recently faile
|
|||||||
|
|
||||||
// Get retrieves a processed image, fetching and processing if necessary.
|
// Get retrieves a processed image, fetching and processing if necessary.
|
||||||
func (s *Service) Get(ctx context.Context, req *ImageRequest) (*ImageResponse, error) {
|
func (s *Service) Get(ctx context.Context, req *ImageRequest) (*ImageResponse, error) {
|
||||||
|
// Propagate AllowHTTP setting to the request
|
||||||
|
req.AllowHTTP = s.allowHTTP
|
||||||
|
|
||||||
// Check negative cache first - skip fetching for recently-failed URLs
|
// Check negative cache first - skip fetching for recently-failed URLs
|
||||||
negHit, err := s.cache.checkNegativeCache(ctx, req)
|
negHit, err := s.cache.checkNegativeCache(ctx, req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
44
internal/imgcache/sourceurl_test.go
Normal file
44
internal/imgcache/sourceurl_test.go
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
package imgcache
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestImageRequest_SourceURL_DefaultHTTPS(t *testing.T) {
|
||||||
|
req := &ImageRequest{
|
||||||
|
SourceHost: "cdn.example.com",
|
||||||
|
SourcePath: "/photos/cat.jpg",
|
||||||
|
SourceQuery: "v=2",
|
||||||
|
}
|
||||||
|
|
||||||
|
got := req.SourceURL()
|
||||||
|
want := "https://cdn.example.com/photos/cat.jpg?v=2"
|
||||||
|
if got != want {
|
||||||
|
t.Errorf("SourceURL() = %q, want %q", got, want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestImageRequest_SourceURL_AllowHTTP(t *testing.T) {
|
||||||
|
req := &ImageRequest{
|
||||||
|
SourceHost: "localhost:8080",
|
||||||
|
SourcePath: "/photos/cat.jpg",
|
||||||
|
AllowHTTP: true,
|
||||||
|
}
|
||||||
|
|
||||||
|
got := req.SourceURL()
|
||||||
|
want := "http://localhost:8080/photos/cat.jpg"
|
||||||
|
if got != want {
|
||||||
|
t.Errorf("SourceURL() = %q, want %q", got, want)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestImageRequest_SourceURL_AllowHTTPFalse(t *testing.T) {
|
||||||
|
req := &ImageRequest{
|
||||||
|
SourceHost: "cdn.example.com",
|
||||||
|
SourcePath: "/img.jpg",
|
||||||
|
AllowHTTP: false,
|
||||||
|
}
|
||||||
|
|
||||||
|
got := req.SourceURL()
|
||||||
|
if got != "https://cdn.example.com/img.jpg" {
|
||||||
|
t.Errorf("SourceURL() = %q, want https scheme", got)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user