package acme import ( "io" "net" "net/http" ) const wellKnown = `/.well-known/acme-challenge/` func init() { registerChallenge(ChallengeHTTP) } type httpChallenge struct { Challenge Addr string } func (c *httpChallenge) ServeHTTP(w http.ResponseWriter, r *http.Request) { io.WriteString(w, c.KeyAuthorization) } func (c *httpChallenge) Solve() error { done := make(chan bool) l, err := net.Listen("tcp", c.Addr) if err != nil { return err } defer l.Close() s := &http.Server{ Handler: c, ConnState: func(_ net.Conn, st http.ConnState) { if st == http.StateClosed { done <- true } }, } s.SetKeepAlivesEnabled(false) go s.Serve(l) <-done return nil }