Present starts an HTTP server if none is already listening on s.address.
(ctx context.Context, _ acme.Challenge)
| 57 | |
| 58 | // Present starts an HTTP server if none is already listening on s.address. |
| 59 | func (s *httpSolver) Present(ctx context.Context, _ acme.Challenge) error { |
| 60 | solversMu.Lock() |
| 61 | defer solversMu.Unlock() |
| 62 | |
| 63 | si := getSolverInfo(s.address) |
| 64 | si.count++ |
| 65 | if si.listener != nil { |
| 66 | return nil // already be served by us |
| 67 | } |
| 68 | |
| 69 | // notice the unusual error handling here; we |
| 70 | // only continue to start a challenge server if |
| 71 | // we got a listener; in all other cases return |
| 72 | ln, err := robustTryListen(s.address) |
| 73 | if ln == nil { |
| 74 | return err |
| 75 | } |
| 76 | |
| 77 | // successfully bound socket, so save listener and start key auth HTTP server |
| 78 | si.listener = ln |
| 79 | go s.serve(ctx, si) |
| 80 | |
| 81 | return nil |
| 82 | } |
| 83 | |
| 84 | // serve is an HTTP server that serves only HTTP challenge responses. |
| 85 | func (s *httpSolver) serve(ctx context.Context, si *solverInfo) { |
no test coverage detected