server: Use separate mutex for handlers
This commit is contained in:
parent
ec269c5c9d
commit
f158bb5f1d
12
server.go
12
server.go
|
@ -51,6 +51,7 @@ type Server struct {
|
||||||
// registered handlers
|
// registered handlers
|
||||||
handlers map[handlerKey]Handler
|
handlers map[handlerKey]Handler
|
||||||
hosts map[string]bool
|
hosts map[string]bool
|
||||||
|
hmu sync.Mutex
|
||||||
|
|
||||||
listeners map[*net.Listener]struct{}
|
listeners map[*net.Listener]struct{}
|
||||||
conns map[*net.Conn]struct{}
|
conns map[*net.Conn]struct{}
|
||||||
|
@ -71,8 +72,8 @@ type handlerKey struct {
|
||||||
// Wildcard patterns are supported (e.g. "*.example.com").
|
// Wildcard patterns are supported (e.g. "*.example.com").
|
||||||
// To handle any hostname, use the wildcard pattern "*".
|
// To handle any hostname, use the wildcard pattern "*".
|
||||||
func (srv *Server) Handle(pattern string, handler Handler) {
|
func (srv *Server) Handle(pattern string, handler Handler) {
|
||||||
srv.mu.Lock()
|
srv.hmu.Lock()
|
||||||
defer srv.mu.Unlock()
|
defer srv.hmu.Unlock()
|
||||||
|
|
||||||
if pattern == "" {
|
if pattern == "" {
|
||||||
panic("gemini: invalid pattern")
|
panic("gemini: invalid pattern")
|
||||||
|
@ -309,7 +310,10 @@ func (srv *Server) getCertificate(h *tls.ClientHelloInfo) (*tls.Certificate, err
|
||||||
// If no certificate is found in the certificate store or the certificate
|
// If no certificate is found in the certificate store or the certificate
|
||||||
// is expired, it calls GetCertificate to retrieve a new certificate.
|
// is expired, it calls GetCertificate to retrieve a new certificate.
|
||||||
func (srv *Server) lookupCertificate(pattern, hostname string) (*tls.Certificate, error) {
|
func (srv *Server) lookupCertificate(pattern, hostname string) (*tls.Certificate, error) {
|
||||||
if _, ok := srv.hosts[pattern]; !ok {
|
srv.hmu.Lock()
|
||||||
|
_, ok := srv.hosts[pattern]
|
||||||
|
srv.hmu.Unlock()
|
||||||
|
if !ok {
|
||||||
return nil, errors.New("hostname not registered")
|
return nil, errors.New("hostname not registered")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -398,6 +402,8 @@ func (srv *Server) respond(conn net.Conn) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (srv *Server) handler(r *Request) Handler {
|
func (srv *Server) handler(r *Request) Handler {
|
||||||
|
srv.hmu.Lock()
|
||||||
|
defer srv.hmu.Unlock()
|
||||||
if h, ok := srv.handlers[handlerKey{r.URL.Scheme, r.URL.Hostname()}]; ok {
|
if h, ok := srv.handlers[handlerKey{r.URL.Scheme, r.URL.Hostname()}]; ok {
|
||||||
return h
|
return h
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user