blob: db46acfcc8d261d7a267a1f90a969595a7538d99 [file] [log] [blame]
// Copyright 2025 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//go:build go1.24
package http3
import "fmt"
// http3Error is an HTTP/3 error code.
type http3Error int
const (
// https://www.rfc-editor.org/rfc/rfc9114.html#section-8.1
errH3NoError = http3Error(0x0100)
errH3GeneralProtocolError = http3Error(0x0101)
errH3InternalError = http3Error(0x0102)
errH3StreamCreationError = http3Error(0x0103)
errH3ClosedCriticalStream = http3Error(0x0104)
errH3FrameUnexpected = http3Error(0x0105)
errH3FrameError = http3Error(0x0106)
errH3ExcessiveLoad = http3Error(0x0107)
errH3IDError = http3Error(0x0108)
errH3SettingsError = http3Error(0x0109)
errH3MissingSettings = http3Error(0x010a)
errH3RequestRejected = http3Error(0x010b)
errH3RequestCancelled = http3Error(0x010c)
errH3RequestIncomplete = http3Error(0x010d)
errH3MessageError = http3Error(0x010e)
errH3ConnectError = http3Error(0x010f)
errH3VersionFallback = http3Error(0x0110)
// https://www.rfc-editor.org/rfc/rfc9204.html#section-8.3
errQPACKDecompressionFailed = http3Error(0x0200)
errQPACKEncoderStreamError = http3Error(0x0201)
errQPACKDecoderStreamError = http3Error(0x0202)
)
func (e http3Error) Error() string {
switch e {
case errH3NoError:
return "H3_NO_ERROR"
case errH3GeneralProtocolError:
return "H3_GENERAL_PROTOCOL_ERROR"
case errH3InternalError:
return "H3_INTERNAL_ERROR"
case errH3StreamCreationError:
return "H3_STREAM_CREATION_ERROR"
case errH3ClosedCriticalStream:
return "H3_CLOSED_CRITICAL_STREAM"
case errH3FrameUnexpected:
return "H3_FRAME_UNEXPECTED"
case errH3FrameError:
return "H3_FRAME_ERROR"
case errH3ExcessiveLoad:
return "H3_EXCESSIVE_LOAD"
case errH3IDError:
return "H3_ID_ERROR"
case errH3SettingsError:
return "H3_SETTINGS_ERROR"
case errH3MissingSettings:
return "H3_MISSING_SETTINGS"
case errH3RequestRejected:
return "H3_REQUEST_REJECTED"
case errH3RequestCancelled:
return "H3_REQUEST_CANCELLED"
case errH3RequestIncomplete:
return "H3_REQUEST_INCOMPLETE"
case errH3MessageError:
return "H3_MESSAGE_ERROR"
case errH3ConnectError:
return "H3_CONNECT_ERROR"
case errH3VersionFallback:
return "H3_VERSION_FALLBACK"
case errQPACKDecompressionFailed:
return "QPACK_DECOMPRESSION_FAILED"
case errQPACKEncoderStreamError:
return "QPACK_ENCODER_STREAM_ERROR"
case errQPACKDecoderStreamError:
return "QPACK_DECODER_STREAM_ERROR"
}
return fmt.Sprintf("H3_ERROR_%v", int(e))
}
// A streamError is an error which terminates a stream, but not the connection.
// https://www.rfc-editor.org/rfc/rfc9114.html#section-8-1
type streamError struct {
code http3Error
message string
}
func (e *streamError) Error() string { return e.message }
func (e *streamError) Unwrap() error { return e.code }
// A connectionError is an error which results in the entire connection closing.
// https://www.rfc-editor.org/rfc/rfc9114.html#section-8-2
type connectionError struct {
code http3Error
message string
}
func (e *connectionError) Error() string { return e.message }
func (e *connectionError) Unwrap() error { return e.code }