diff --git a/config.go b/config.go index 0cd8e46a..968a3f48 100644 --- a/config.go +++ b/config.go @@ -1207,7 +1207,7 @@ func (cfg *Config) getACMEChallengeInfo(ctx context.Context, identifier string, if errors.Is(err, fs.ErrNotExist) { continue } - return Challenge{}, false, fmt.Errorf("opening distributed challenge token file %s: %v", tokenKey, err) + return Challenge{}, false, fmt.Errorf("opening distributed challenge token file %s: %w", tokenKey, err) } if !challengeFound { return Challenge{}, false, fmt.Errorf("%w: no information found to solve challenge for identifier: %s", errNoACMEChallengeInfo, identifier) diff --git a/httphandlers.go b/httphandlers.go index 6247eda3..199b23e0 100644 --- a/httphandlers.go +++ b/httphandlers.go @@ -15,6 +15,7 @@ package certmagic import ( + "context" "errors" "fmt" "net/http" @@ -116,7 +117,10 @@ func (am *ACMEIssuer) distributedHTTPChallengeSolver(w http.ResponseWriter, r *h // couldn't get challenge info even with distributed solver log := am.Logger.Warn - if errors.Is(err, errNoACMEChallengeInfo) { + switch { + case errors.Is(err, errNoACMEChallengeInfo): + log = am.Logger.Debug + case errors.Is(err, context.Canceled) && errors.Is(r.Context().Err(), context.Canceled): log = am.Logger.Debug } log("looking up info for HTTP challenge", diff --git a/httphandlers_test.go b/httphandlers_test.go index 949d1d84..83e2da7e 100644 --- a/httphandlers_test.go +++ b/httphandlers_test.go @@ -78,9 +78,10 @@ func TestHTTPChallengeHandlerNoOp(t *testing.T) { func TestHTTPChallengeLookupLogLevel(t *testing.T) { tests := []struct { - name string - storage Storage - wantLevel zapcore.Level + name string + storage Storage + cancelRequest bool + wantLevel zapcore.Level }{ { name: "no active challenge", @@ -95,6 +96,23 @@ func TestHTTPChallengeLookupLogLevel(t *testing.T) { }, wantLevel: zap.WarnLevel, }, + { + name: "request canceled", + storage: loadResultStorage{ + Storage: &memoryStorage{}, + err: context.Canceled, + }, + cancelRequest: true, + wantLevel: zap.DebugLevel, + }, + { + name: "storage operation canceled", + storage: loadResultStorage{ + Storage: &memoryStorage{}, + err: context.Canceled, + }, + wantLevel: zap.WarnLevel, + }, { name: "storage failure", storage: loadResultStorage{ @@ -123,6 +141,11 @@ func TestHTTPChallengeLookupLogLevel(t *testing.T) { "http://example.com/.well-known/acme-challenge/token", nil, ) + if tt.cancelRequest { + ctx, cancel := context.WithCancel(req.Context()) + cancel() + req = req.WithContext(ctx) + } if am.HandleHTTPChallenge(httptest.NewRecorder(), req) { t.Fatal("expected challenge request not to be handled") }