in client/client.go [213:260]
func (hs *httpSource) GetByModule(ctx context.Context, module string) (_ []*osv.Entry, err error) {
defer derrors.Wrap(&err, "GetByModule(%q)", module)
index, err := hs.Index(ctx)
if err != nil {
return nil, err
}
lastModified, present := index[module]
if !present {
return nil, nil
}
if hs.cache != nil {
if cached, err := hs.cache.ReadEntries(hs.dbName, module); err != nil {
return nil, err
} else if len(cached) != 0 {
var stale bool
for _, c := range cached {
if c.Modified.Before(lastModified) {
stale = true
break
}
}
if !stale {
return cached, nil
}
}
}
content, err := hs.readBody(ctx, fmt.Sprintf("%s/%s.json", hs.url, module))
if err != nil || content == nil {
return nil, err
}
var e []*osv.Entry
// TODO: we may want to check that the returned entries actually match
// the module we asked about, so that the cache cannot be poisoned
if err = json.Unmarshal(content, &e); err != nil {
return nil, err
}
if hs.cache != nil {
if err := hs.cache.WriteEntries(hs.dbName, module, e); err != nil {
return nil, err
}
}
return e, nil
}