Skip to content

Commit 8f93b9f

Browse files
authored
fix: add errorsource to TLS errors correctly (#1256)
1 parent ef8d2e9 commit 8f93b9f

File tree

2 files changed

+30
-28
lines changed

2 files changed

+30
-28
lines changed

experimental/status/status_source.go

+9-23
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package status
22

33
import (
44
"context"
5+
"crypto/tls"
56
"crypto/x509"
67
"errors"
78
"fmt"
@@ -191,30 +192,15 @@ func isDNSNotFoundError(err error) bool {
191192
// isTLSCertificateVerificationError checks if the error is related to TLS certificate verification.
192193
func isTLSCertificateVerificationError(err error) bool {
193194
var (
194-
certErr *x509.CertificateInvalidError
195-
unknownAuthErr x509.UnknownAuthorityError
196-
hostnameErr *x509.HostnameError
195+
certErr x509.CertificateInvalidError
196+
unknownAuthorityErr x509.UnknownAuthorityError
197+
hostnameErr x509.HostnameError
198+
tlsError *tls.CertificateVerificationError
197199
)
198-
199-
// Directly check for certificate-related errors
200-
if errors.As(err, &certErr) ||
201-
errors.As(err, &unknownAuthErr) ||
202-
errors.As(err, &hostnameErr) {
203-
return true
204-
}
205-
206-
// Check if the error is wrapped in a *url.Error
207-
var urlErr *url.Error
208-
if errors.As(err, &urlErr) {
209-
// Check the underlying error in urlErr
210-
if errors.As(urlErr.Err, &certErr) ||
211-
errors.As(urlErr.Err, &unknownAuthErr) ||
212-
errors.As(urlErr.Err, &hostnameErr) {
213-
return true
214-
}
215-
}
216-
217-
return false
200+
return errors.As(err, &certErr) ||
201+
errors.As(err, &unknownAuthorityErr) ||
202+
errors.As(err, &hostnameErr) ||
203+
errors.As(err, &tlsError)
218204
}
219205

220206
// isHTTPEOFError returns true if the error is an EOF error inside of url.Error or net.OpError, indicating the connection was closed prematurely by server

experimental/status/status_source_test.go

+21-5
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package status_test
22

33
import (
44
"context"
5+
"crypto/tls"
56
"crypto/x509"
67
"errors"
78
"fmt"
@@ -241,7 +242,7 @@ func TestIsDownstreamHTTPError(t *testing.T) {
241242
},
242243
{
243244
name: "wrapped *url.Error with UnknownAuthorityError",
244-
err: &url.Error{Op: "Get", URL: "https://example.com", Err: x509.UnknownAuthorityError{}},
245+
err: &url.Error{Op: "Get", URL: "https://example.com", Err: &tls.CertificateVerificationError{Err: x509.UnknownAuthorityError{}}},
245246
expected: true,
246247
},
247248
{
@@ -251,7 +252,7 @@ func TestIsDownstreamHTTPError(t *testing.T) {
251252
},
252253
{
253254
name: "direct CertificateInvalidError",
254-
err: &x509.CertificateInvalidError{Reason: x509.Expired, Cert: nil},
255+
err: x509.CertificateInvalidError{Reason: x509.Expired, Cert: nil},
255256
expected: true,
256257
},
257258
{
@@ -294,9 +295,24 @@ func TestIsDownstreamHTTPError(t *testing.T) {
294295
err: &url.Error{
295296
Op: "Get",
296297
URL: "https://example.com",
297-
Err: &x509.HostnameError{
298-
Host: "example.com",
299-
Certificate: &x509.Certificate{},
298+
Err: &tls.CertificateVerificationError{
299+
Err: x509.HostnameError{
300+
Host: "example.com",
301+
Certificate: &x509.Certificate{},
302+
},
303+
},
304+
},
305+
expected: true,
306+
},
307+
{
308+
name: "TLS certificate expired",
309+
err: &url.Error{
310+
Op: "Get",
311+
URL: "https://example.com",
312+
Err: &tls.CertificateVerificationError{
313+
Err: x509.CertificateInvalidError{
314+
Reason: x509.Expired,
315+
},
300316
},
301317
},
302318
expected: true,

0 commit comments

Comments
 (0)