62 lines
1.4 KiB
Go
62 lines
1.4 KiB
Go
package pipeline
|
|
|
|
import (
|
|
"context"
|
|
"io"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"evobgp/internal/store"
|
|
)
|
|
|
|
// PrefetchCDNSourceETags performs conditional GETs for CDN module sources and updates stored ETags when the origin responds 200.
|
|
func PrefetchCDNSourceETags(ctx context.Context, st store.Backend, hc *http.Client) error {
|
|
if hc == nil {
|
|
hc = http.DefaultClient
|
|
}
|
|
tenants, err := st.ListTenantIDs()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
for _, tid := range tenants {
|
|
for _, mod := range st.ListModules(tid) {
|
|
if !mod.Enabled || mod.Type != "CDN_CIDRS" {
|
|
continue
|
|
}
|
|
sources, err := st.ListCDNSources(tid, mod.ID)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
for _, src := range sources {
|
|
u := strings.TrimSpace(src.URL)
|
|
if u == "" {
|
|
continue
|
|
}
|
|
req, err := http.NewRequestWithContext(ctx, http.MethodGet, u, nil)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
if strings.TrimSpace(src.Etag) != "" {
|
|
req.Header.Set("If-None-Match", strings.TrimSpace(src.Etag))
|
|
}
|
|
resp, err := hc.Do(req)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
_, _ = io.Copy(io.Discard, resp.Body)
|
|
_ = resp.Body.Close()
|
|
if resp.StatusCode != http.StatusOK {
|
|
continue
|
|
}
|
|
etag := strings.TrimSpace(resp.Header.Get("ETag"))
|
|
if etag == "" || etag == strings.TrimSpace(src.Etag) {
|
|
continue
|
|
}
|
|
e := etag
|
|
_, _ = st.UpdateCDNSource(tid, mod.ID, src.ID, &store.CDNSourcePatch{Etag: &e})
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
}
|