aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--solve_http.go13
-rw-r--r--solve_tls.go11
2 files changed, 8 insertions, 16 deletions
diff --git a/solve_http.go b/solve_http.go
index f1ab57d..f0923a5 100644
--- a/solve_http.go
+++ b/solve_http.go
@@ -5,25 +5,20 @@ import (
"log"
"net/http"
"path"
+ "sync"
)
type httpSolver struct {
http.Server
+ sync.Once
}
func NewHTTPSolver(addr string) (Solver, error) {
- s := &httpSolver{
- Server: http.Server{Addr: addr},
- }
- go func() {
- if err := s.ListenAndServe(); err != nil {
- log.Fatal(err)
- }
- }()
- return s, nil
+ return &httpSolver{Server: http.Server{Addr: addr}}, nil
}
func (s *httpSolver) Solve(ch Challenge) error {
+ s.Do(func() { go s.ListenAndServe() })
p := path.Join(WellKnown, ch.Token)
log.Println("solve http", p)
http.HandleFunc(p, func(w http.ResponseWriter, r *http.Request) {
diff --git a/solve_tls.go b/solve_tls.go
index c5e5fed..babc5e4 100644
--- a/solve_tls.go
+++ b/solve_tls.go
@@ -9,6 +9,7 @@ import (
"log"
"math/big"
"net/http"
+ "sync"
"time"
)
@@ -17,6 +18,7 @@ var errNoCert = errors.New("no cert")
type tlsSolver struct {
http.Server
sni map[string]*tls.Certificate
+ sync.Once
}
func (s *tlsSolver) getCert(h *tls.ClientHelloInfo) (*tls.Certificate, error) {
@@ -36,16 +38,10 @@ func NewTLSSolver(addr string) (Solver, error) {
Server: http.Server{Addr: addr},
sni: make(map[string]*tls.Certificate),
}
- config := &tls.Config{
+ s.Server.TLSConfig = &tls.Config{
Certificates: []tls.Certificate{dummy},
GetCertificate: s.getCert,
}
- s.Server.TLSConfig = config
- go func() {
- if err := s.ListenAndServeTLS("", ""); err != nil {
- log.Fatal(err)
- }
- }()
return s, nil
}
@@ -83,6 +79,7 @@ func newCert(domain string) (tls.Certificate, error) {
}
func (s *tlsSolver) Solve(ch Challenge) error {
+ s.Do(func() { go s.ListenAndServeTLS("", "") })
name := ch.SNIName()
log.Println("solve tls", name)
crt, err := newCert(name)