package acme import ( "io" "log" "net/http" "path" "sync" ) type httpSolver struct { http.Server sync.Once } func NewHTTPSolver(addr string) (Solver, error) { if addr == "" { return nil, ErrSkipped } return &httpSolver{Server: http.Server{Addr: addr}}, nil } func (s *httpSolver) Solve(ch Challenge) error { go s.Do(func() { log.Fatal(s.ListenAndServe()) }) p := path.Join(WellKnown, ch.Token) log.Println("Solve http", p) http.HandleFunc(p, func(w http.ResponseWriter, r *http.Request) { io.WriteString(w, ch.KeyAuthorization) }) return nil } func (*httpSolver) Solved() error { return nil } func (*httpSolver) Type() ChalType { return ChallengeHTTP }