aboutsummaryrefslogtreecommitdiff
path: root/server.go
diff options
context:
space:
mode:
authorAdnan Maolood <[email protected]>2020-10-31 15:11:05 -0400
committerAdnan Maolood <[email protected]>2020-10-31 15:11:05 -0400
commita89065babbbd9bc83fcb3a56a02e16a533f2abe7 (patch)
tree431a99a5ff36e0a5e825585427a376ef8c309511 /server.go
parentAdd ParseLines function (diff)
downloadgo-gemini-a89065babbbd9bc83fcb3a56a02e16a533f2abe7.tar.xz
go-gemini-a89065babbbd9bc83fcb3a56a02e16a533f2abe7.zip
Fix handling of wildcard hostnames
Diffstat (limited to 'server.go')
-rw-r--r--server.go23
1 files changed, 12 insertions, 11 deletions
diff --git a/server.go b/server.go
index 465a8a4..5a466ed 100644
--- a/server.go
+++ b/server.go
@@ -22,7 +22,7 @@ type Server struct {
Certificates CertificateStore
// CreateCertificate, if not nil, will be called to create a new certificate
- // if the current one is expired or missing.
+ // if the current one is expired.
CreateCertificate func(hostname string) (tls.Certificate, error)
// registered responders
@@ -32,7 +32,6 @@ type Server struct {
type responderKey struct {
scheme string
hostname string
- wildcard bool
}
// Register registers a responder for the given pattern.
@@ -66,11 +65,6 @@ func (s *Server) Register(pattern string, responder Responder) {
key.scheme = "gemini"
key.hostname = split[0]
}
- split = strings.SplitN(key.hostname, ".", 2)
- if len(split) == 2 && split[0] == "*" {
- key.hostname = split[1]
- key.wildcard = true
- }
if _, ok := s.responders[key]; ok {
panic("gemini: multiple registrations for " + pattern)
@@ -136,8 +130,14 @@ func (s *Server) Serve(l net.Listener) error {
func (s *Server) getCertificate(h *tls.ClientHelloInfo) (*tls.Certificate, error) {
cert, err := s.Certificates.Lookup(h.ServerName)
- switch err {
- case ErrCertificateExpired, ErrCertificateUnknown:
+ if err == ErrCertificateUnknown {
+ wildcard := strings.SplitN(h.ServerName, ".", 2)
+ if len(wildcard) == 2 {
+ cert, err = s.Certificates.Lookup("*." + wildcard[1])
+ }
+ }
+
+ if err == ErrCertificateExpired {
if s.CreateCertificate != nil {
cert, err := s.CreateCertificate(h.ServerName)
if err == nil {
@@ -146,6 +146,7 @@ func (s *Server) getCertificate(h *tls.ClientHelloInfo) (*tls.Certificate, error
return &cert, err
}
}
+
return cert, err
}
@@ -194,12 +195,12 @@ func (s *Server) respond(conn net.Conn) {
}
func (s *Server) responder(r *Request) Responder {
- if h, ok := s.responders[responderKey{r.URL.Scheme, r.URL.Hostname(), false}]; ok {
+ if h, ok := s.responders[responderKey{r.URL.Scheme, r.URL.Hostname()}]; ok {
return h
}
wildcard := strings.SplitN(r.URL.Hostname(), ".", 2)
if len(wildcard) == 2 {
- if h, ok := s.responders[responderKey{r.URL.Scheme, wildcard[1], true}]; ok {
+ if h, ok := s.responders[responderKey{r.URL.Scheme, "*." + wildcard[1]}]; ok {
return h
}
}