ab723147c9
Remote proxying drops the query string, so paginated JSON APIs (e.g. Galaxy `versions/?limit=&offset=`) cannot be served. Forwarding the raw query would let arbitrary params mint unbounded cache entries and bypass path-anchored blocklists. - add `provider.QueryForwarder`, mapping each forwarded param for a path to a validator that canonicalises or rejects its value - forward only validated params upstream and into the cache key, single-valued and in sorted order - classify on the bare path so blocklist/allowlist/mutability patterns ignore the query - evict a path together with its `path?...` query variants - leave providers without `QueryForwarder` unchanged Reviewed-on: #146 Co-authored-by: unkin-agent <unkin-agent@unkin.net> Co-committed-by: unkin-agent <unkin-agent@unkin.net>
13 lines
537 B
Go
13 lines
537 B
Go
package provider
|
|
|
|
// QueryForwarder is a remote provider whose upstream answers depend on the
|
|
// query string (e.g. paginated JSON APIs). Only the named params for path are
|
|
// forwarded upstream and kept in the cache key, each as the canonical value
|
|
// its validator returns; a value the validator rejects is dropped.
|
|
type QueryForwarder interface {
|
|
ForwardedQuery(path string) map[string]QueryValidator
|
|
}
|
|
|
|
// QueryValidator canonicalises a raw query value, reporting false to drop it.
|
|
type QueryValidator func(v string) (string, bool)
|