(der []byte)
| 17 | type weakCertCache struct{ sync.Map } |
| 18 | |
| 19 | func (wcc *weakCertCache) newCert(der []byte) (*x509.Certificate, error) { |
| 20 | if entry, ok := wcc.Load(string(der)); ok { |
| 21 | if v := entry.(weak.Pointer[x509.Certificate]).Value(); v != nil { |
| 22 | return v, nil |
| 23 | } |
| 24 | } |
| 25 | |
| 26 | cert, err := x509.ParseCertificate(der) |
| 27 | if err != nil { |
| 28 | return nil, err |
| 29 | } |
| 30 | |
| 31 | wp := weak.Make(cert) |
| 32 | if entry, loaded := wcc.LoadOrStore(string(der), wp); !loaded { |
| 33 | runtime.AddCleanup(cert, func(_ any) { wcc.CompareAndDelete(string(der), entry) }, any(string(der))) |
| 34 | } else if v := entry.(weak.Pointer[x509.Certificate]).Value(); v != nil { |
| 35 | return v, nil |
| 36 | } else { |
| 37 | if wcc.CompareAndSwap(string(der), entry, wp) { |
| 38 | runtime.AddCleanup(cert, func(_ any) { wcc.CompareAndDelete(string(der), wp) }, any(string(der))) |
| 39 | } |
| 40 | } |
| 41 | return cert, nil |
| 42 | } |
| 43 | |
| 44 | var globalCertCache = new(weakCertCache) |
no outgoing calls
no test coverage detected