package tls
import (
"crypto/x509"
"runtime"
"sync"
"weak"
)
type weakCertCache struct { sync .Map }
func (wcc *weakCertCache ) newCert (der []byte ) (*x509 .Certificate , error ) {
if entry , ok := wcc .Load (string (der )); ok {
if v := entry .(weak .Pointer [x509 .Certificate ]).Value (); v != nil {
return v , nil
}
}
cert , err := x509 .ParseCertificate (der )
if err != nil {
return nil , err
}
wp := weak .Make (cert )
if entry , loaded := wcc .LoadOrStore (string (der ), wp ); !loaded {
runtime .AddCleanup (cert , func (_ any ) { wcc .CompareAndDelete (string (der ), entry ) }, any (string (der )))
} else if v := entry .(weak .Pointer [x509 .Certificate ]).Value (); v != nil {
return v , nil
} else {
if wcc .CompareAndSwap (string (der ), entry , wp ) {
runtime .AddCleanup (cert , func (_ any ) { wcc .CompareAndDelete (string (der ), wp ) }, any (string (der )))
}
}
return cert , nil
}
var globalCertCache = new (weakCertCache )
The pages are generated with Golds v0.7.7-preview . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .