expose crypto/tls errors on the TransportError (#4015)

This commit is contained in:
Marten Seemann
2023-08-18 17:01:49 +07:00
committed by GitHub
parent f7f4872bb9
commit 501cc21c4b
8 changed files with 40 additions and 13 deletions

View File

@@ -17,15 +17,16 @@ type TransportError struct {
FrameType uint64
ErrorCode TransportErrorCode
ErrorMessage string
error error // only set for local errors, sometimes
}
var _ error = &TransportError{}
// NewLocalCryptoError create a new TransportError instance for a crypto error
func NewLocalCryptoError(tlsAlert uint8, errorMessage string) *TransportError {
func NewLocalCryptoError(tlsAlert uint8, err error) *TransportError {
return &TransportError{
ErrorCode: 0x100 + TransportErrorCode(tlsAlert),
ErrorMessage: errorMessage,
ErrorCode: 0x100 + TransportErrorCode(tlsAlert),
error: err,
}
}
@@ -35,6 +36,9 @@ func (e *TransportError) Error() string {
str += fmt.Sprintf(" (frame type: %#x)", e.FrameType)
}
msg := e.ErrorMessage
if len(msg) == 0 && e.error != nil {
msg = e.error.Error()
}
if len(msg) == 0 {
msg = e.ErrorCode.Message()
}
@@ -48,6 +52,10 @@ func (e *TransportError) Is(target error) bool {
return target == net.ErrClosed
}
func (e *TransportError) Unwrap() error {
return e.error
}
// An ApplicationErrorCode is an application-defined error code.
type ApplicationErrorCode uint64

View File

@@ -2,6 +2,7 @@ package qerr
import (
"errors"
"fmt"
"net"
"github.com/quic-go/quic-go/internal/protocol"
@@ -10,6 +11,12 @@ import (
. "github.com/onsi/gomega"
)
type myError int
var _ error = myError(0)
func (e myError) Error() string { return fmt.Sprintf("my error %d", e) }
var _ = Describe("QUIC Errors", func() {
Context("Transport Errors", func() {
It("has a string representation", func() {
@@ -41,12 +48,20 @@ var _ = Describe("QUIC Errors", func() {
Context("crypto errors", func() {
It("has a string representation for errors with a message", func() {
err := NewLocalCryptoError(0x42, "foobar")
Expect(err.Error()).To(Equal("CRYPTO_ERROR 0x142 (local): foobar"))
myErr := myError(1337)
err := NewLocalCryptoError(0x42, myErr)
Expect(err.Error()).To(Equal("CRYPTO_ERROR 0x142 (local): my error 1337"))
})
It("unwraps errors", func() {
var myErr myError
err := NewLocalCryptoError(0x42, myError(1337))
Expect(errors.As(err, &myErr)).To(BeTrue())
Expect(myErr).To(BeEquivalentTo(1337))
})
It("has a string representation for errors without a message", func() {
err := NewLocalCryptoError(0x2a, "")
err := NewLocalCryptoError(0x2a, nil)
Expect(err.Error()).To(Equal("CRYPTO_ERROR 0x12a (local): tls: bad certificate"))
})
})