From 90cb792477c532368d58cdfadd0048deb97cb57b Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Tue, 19 Apr 2016 15:54:18 +0700 Subject: [PATCH] create a QuicError type --- errorcodes/error_codes.go | 1 + protocol/quic_error.go | 21 +++++++++++++++++++++ session.go | 16 ++++++++++++---- 3 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 protocol/quic_error.go diff --git a/errorcodes/error_codes.go b/errorcodes/error_codes.go index 7f063f8a1..ac0233009 100644 --- a/errorcodes/error_codes.go +++ b/errorcodes/error_codes.go @@ -4,6 +4,7 @@ import "github.com/lucas-clemente/quic-go/protocol" const ( QUIC_NO_ERROR = protocol.ErrorCode(0) + QUIC_INTERNAL_ERROR = protocol.ErrorCode(1) QUIC_STREAM_DATA_AFTER_TERMINATION = protocol.ErrorCode(2) // QUIC_SERVER_ERROR_PROCESSING_STREAM= There was some server error which halted stream processing. // QUIC_MULTIPLE_TERMINATION_OFFSETS= The sender received two mismatching fin or reset offsets for a single stream. diff --git a/protocol/quic_error.go b/protocol/quic_error.go new file mode 100644 index 000000000..f8cb92125 --- /dev/null +++ b/protocol/quic_error.go @@ -0,0 +1,21 @@ +package protocol + +// A QuicError is a QUIC error +type QuicError struct { + ErrorCode ErrorCode + ErrorMessage string +} + +// NewQuicError creates a new Quic Error +func NewQuicError(errorCode ErrorCode, errorMessage string) *QuicError { + return &QuicError{ + ErrorCode: errorCode, + ErrorMessage: errorMessage, + } +} + +func (e *QuicError) Error() string { + return e.ErrorMessage +} + +var _ error = &QuicError{} diff --git a/session.go b/session.go index b1e7c6ccd..29082e229 100644 --- a/session.go +++ b/session.go @@ -138,10 +138,10 @@ func (s *Session) HandlePacket(addr *net.UDPAddr, publicHeaderBinary []byte, pub // PING, do nothing r.ReadByte() default: - err = fmt.Errorf("unknown frame type: %x", typeByte) + err = protocol.NewQuicError(errorcodes.QUIC_INVALID_FRAME_DATA, fmt.Sprintf("unknown type byte 0x%x", typeByte)) } if err != nil { - s.Close(errorcodes.QUIC_INVALID_FRAME_DATA) + s.Close(err) return err } } @@ -231,9 +231,17 @@ func (s *Session) handleRstStreamFrame(r *bytes.Reader) error { } // Close closes the connection by sending a ConnectionClose frame -func (s *Session) Close(errorCode protocol.ErrorCode) error { +func (s *Session) Close(e error) error { + errorCode := protocol.ErrorCode(1) + reasonPhrase := e.Error() + + quicError, ok := e.(*protocol.QuicError) + if ok { + errorCode = quicError.ErrorCode + } frame := &frames.ConnectionCloseFrame{ - ErrorCode: errorCode, + ErrorCode: errorCode, + ReasonPhrase: reasonPhrase, } return s.SendFrame(frame) }