From 7437ee7a0928ee553432d4f31b61a67dd64f4e9a Mon Sep 17 00:00:00 2001 From: Alessandro Ros Date: Wed, 3 Jan 2024 21:13:20 +0100 Subject: [PATCH] update golangci-lint (#2868) --- .golangci.yml | 4 +++ Makefile | 2 +- internal/conf/env/env.go | 10 +++--- internal/conf/path.go | 8 ++--- internal/core/auth.go | 8 ++--- internal/core/path.go | 4 +-- internal/core/path_manager.go | 2 +- internal/defs/auth.go | 6 ++-- internal/defs/path.go | 6 ++-- internal/externalcmd/cmd.go | 2 +- internal/externalcmd/cmd_unix.go | 9 +++--- internal/formatprocessor/ac3.go | 4 ++- internal/formatprocessor/av1.go | 4 ++- internal/formatprocessor/h264.go | 4 ++- internal/formatprocessor/h265.go | 4 ++- internal/formatprocessor/mjpeg.go | 4 ++- internal/formatprocessor/mpeg1_audio.go | 4 ++- internal/formatprocessor/mpeg1_video.go | 4 ++- internal/formatprocessor/mpeg4_audio.go | 3 +- internal/formatprocessor/mpeg4_video.go | 3 +- internal/formatprocessor/vp8.go | 4 ++- internal/formatprocessor/vp9.go | 4 ++- internal/protocols/rtmp/rawmessage/reader.go | 2 +- internal/protocols/rtmp/reader.go | 33 ++++++++++---------- internal/record/format_fmp4.go | 4 +-- internal/servers/hls/http_server.go | 4 ++- internal/servers/hls/muxer.go | 14 ++++----- internal/servers/rtmp/conn.go | 6 ++-- internal/servers/rtsp/conn.go | 18 ++++++----- internal/servers/rtsp/session.go | 31 +++++++++--------- internal/servers/srt/conn.go | 8 +++-- internal/servers/webrtc/http_server.go | 4 ++- internal/servers/webrtc/session.go | 7 +++-- 33 files changed, 137 insertions(+), 97 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 593d6b20..d2c93841 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,7 +1,10 @@ linters: enable: + - asciicheck + - bidichk - bodyclose - dupl + - errorlint - exportloopref - gochecknoinits - gocritic @@ -13,6 +16,7 @@ linters: - prealloc - revive - unconvert + - tparallel - wastedassign - whitespace diff --git a/Makefile b/Makefile index df2bdbe3..137eb923 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ BASE_IMAGE = golang:1.21-alpine3.18 -LINT_IMAGE = golangci/golangci-lint:v1.55.0 +LINT_IMAGE = golangci/golangci-lint:v1.55.2 NODE_IMAGE = node:16-alpine3.18 ALPINE_IMAGE = alpine:3.18 RPI32_IMAGE = balenalib/raspberry-pi:bullseye-run-20230712 diff --git a/internal/conf/env/env.go b/internal/conf/env/env.go index b71f484e..7c60ca78 100644 --- a/internal/conf/env/env.go +++ b/internal/conf/env/env.go @@ -38,12 +38,12 @@ func loadEnvInternal(env map[string]string, prefix string, prv reflect.Value) er } err := i.UnmarshalEnv(prefix, ev) if err != nil { - return fmt.Errorf("%s: %s", prefix, err) + return fmt.Errorf("%s: %w", prefix, err) } } else if envHasAtLeastAKeyWithPrefix(env, prefix) { err := i.UnmarshalEnv(prefix, "") if err != nil { - return fmt.Errorf("%s: %s", prefix, err) + return fmt.Errorf("%s: %w", prefix, err) } } return nil @@ -66,7 +66,7 @@ func loadEnvInternal(env map[string]string, prefix string, prv reflect.Value) er } iv, err := strconv.ParseInt(ev, 10, 32) if err != nil { - return fmt.Errorf("%s: %s", prefix, err) + return fmt.Errorf("%s: %w", prefix, err) } prv.Elem().SetInt(iv) } @@ -79,7 +79,7 @@ func loadEnvInternal(env map[string]string, prefix string, prv reflect.Value) er } iv, err := strconv.ParseUint(ev, 10, 32) if err != nil { - return fmt.Errorf("%s: %s", prefix, err) + return fmt.Errorf("%s: %w", prefix, err) } prv.Elem().SetUint(iv) } @@ -92,7 +92,7 @@ func loadEnvInternal(env map[string]string, prefix string, prv reflect.Value) er } iv, err := strconv.ParseFloat(ev, 64) if err != nil { - return fmt.Errorf("%s: %s", prefix, err) + return fmt.Errorf("%s: %w", prefix, err) } prv.Elem().SetFloat(iv) } diff --git a/internal/conf/path.go b/internal/conf/path.go index eed26f8d..c60d5253 100644 --- a/internal/conf/path.go +++ b/internal/conf/path.go @@ -222,7 +222,7 @@ func (pconf *Path) check(conf *Conf, name string) error { case name == "" || name[0] != '~': // normal path err := IsValidPathName(name) if err != nil { - return fmt.Errorf("invalid path name '%s': %s", name, err) + return fmt.Errorf("invalid path name '%s': %w", name, err) } default: // regular expression-based path @@ -320,14 +320,14 @@ func (pconf *Path) check(conf *Conf, name string) error { if pconf.SRTReadPassphrase != "" { err := srtCheckPassphrase(pconf.SRTReadPassphrase) if err != nil { - return fmt.Errorf("invalid 'readRTPassphrase': %v", err) + return fmt.Errorf("invalid 'readRTPassphrase': %w", err) } } if pconf.Fallback != "" { if strings.HasPrefix(pconf.Fallback, "/") { err := IsValidPathName(pconf.Fallback[1:]) if err != nil { - return fmt.Errorf("'%s': %s", pconf.Fallback, err) + return fmt.Errorf("'%s': %w", pconf.Fallback, err) } } else { _, err := base.ParseURL(pconf.Fallback) @@ -384,7 +384,7 @@ func (pconf *Path) check(conf *Conf, name string) error { err := srtCheckPassphrase(pconf.SRTPublishPassphrase) if err != nil { - return fmt.Errorf("invalid 'srtPublishPassphrase': %v", err) + return fmt.Errorf("invalid 'srtPublishPassphrase': %w", err) } } diff --git a/internal/core/auth.go b/internal/core/auth.go index b643c37b..04ef357a 100644 --- a/internal/core/auth.go +++ b/internal/core/auth.go @@ -97,7 +97,7 @@ func doAuthentication( accessRequest, ) if err != nil { - return &defs.ErrAuthentication{Message: fmt.Sprintf("external authentication failed: %s", err)} + return defs.AuthenticationError{Message: fmt.Sprintf("external authentication failed: %s", err)} } } @@ -117,7 +117,7 @@ func doAuthentication( if pathIPs != nil { if !ipEqualOrInRange(accessRequest.IP, pathIPs) { - return &defs.ErrAuthentication{Message: fmt.Sprintf("IP %s not allowed", accessRequest.IP)} + return defs.AuthenticationError{Message: fmt.Sprintf("IP %s not allowed", accessRequest.IP)} } } @@ -132,11 +132,11 @@ func doAuthentication( "IPCAM", accessRequest.RTSPNonce) if err != nil { - return &defs.ErrAuthentication{Message: err.Error()} + return defs.AuthenticationError{Message: err.Error()} } } else if !checkCredential(pathUser, accessRequest.User) || !checkCredential(pathPass, accessRequest.Pass) { - return &defs.ErrAuthentication{Message: "invalid credentials"} + return defs.AuthenticationError{Message: "invalid credentials"} } } diff --git a/internal/core/path.go b/internal/core/path.go index 64eeca0f..e6655028 100644 --- a/internal/core/path.go +++ b/internal/core/path.go @@ -493,7 +493,7 @@ func (pa *path) doDescribe(req defs.PathDescribeReq) { return } - req.Res <- defs.PathDescribeRes{Err: defs.ErrPathNoOnePublishing{PathName: pa.name}} + req.Res <- defs.PathDescribeRes{Err: defs.PathNoOnePublishingError{PathName: pa.name}} } func (pa *path) doRemovePublisher(req defs.PathRemovePublisherReq) { @@ -584,7 +584,7 @@ func (pa *path) doAddReader(req defs.PathAddReaderReq) { return } - req.Res <- defs.PathAddReaderRes{Err: defs.ErrPathNoOnePublishing{PathName: pa.name}} + req.Res <- defs.PathAddReaderRes{Err: defs.PathNoOnePublishingError{PathName: pa.name}} } func (pa *path) doRemoveReader(req defs.PathRemoveReaderReq) { diff --git a/internal/core/path_manager.go b/internal/core/path_manager.go index f08ecfcd..a42e2c50 100644 --- a/internal/core/path_manager.go +++ b/internal/core/path_manager.go @@ -38,7 +38,7 @@ func pathConfCanBeUpdated(oldPathConf *conf.Path, newPathConf *conf.Path) bool { func getConfForPath(pathConfs map[string]*conf.Path, name string) (string, *conf.Path, []string, error) { err := conf.IsValidPathName(name) if err != nil { - return "", nil, nil, fmt.Errorf("invalid path name: %s (%s)", err, name) + return "", nil, nil, fmt.Errorf("invalid path name: %w (%s)", err, name) } // normal path diff --git a/internal/defs/auth.go b/internal/defs/auth.go index 98266f1c..a0d708f9 100644 --- a/internal/defs/auth.go +++ b/internal/defs/auth.go @@ -12,12 +12,12 @@ const ( AuthProtocolSRT AuthProtocol = "srt" ) -// ErrAuthentication is a authentication error. -type ErrAuthentication struct { +// AuthenticationError is a authentication error. +type AuthenticationError struct { Message string } // Error implements the error interface. -func (e *ErrAuthentication) Error() string { +func (e AuthenticationError) Error() string { return "authentication failed: " + e.Message } diff --git a/internal/defs/path.go b/internal/defs/path.go index fe061005..b1b257a1 100644 --- a/internal/defs/path.go +++ b/internal/defs/path.go @@ -13,13 +13,13 @@ import ( "github.com/bluenviron/mediamtx/internal/stream" ) -// ErrPathNoOnePublishing is returned when no one is publishing. -type ErrPathNoOnePublishing struct { +// PathNoOnePublishingError is returned when no one is publishing. +type PathNoOnePublishingError struct { PathName string } // Error implements the error interface. -func (e ErrPathNoOnePublishing) Error() string { +func (e PathNoOnePublishingError) Error() string { return fmt.Sprintf("no one is publishing to path '%s'", e.PathName) } diff --git a/internal/externalcmd/cmd.go b/internal/externalcmd/cmd.go index 3e820abb..132465fa 100644 --- a/internal/externalcmd/cmd.go +++ b/internal/externalcmd/cmd.go @@ -76,7 +76,7 @@ func (e *Cmd) run() { for { err := e.runOSSpecific() - if err == errTerminated { + if errors.Is(err, errTerminated) { return } diff --git a/internal/externalcmd/cmd_unix.go b/internal/externalcmd/cmd_unix.go index 06cb30c8..fa9b5831 100644 --- a/internal/externalcmd/cmd_unix.go +++ b/internal/externalcmd/cmd_unix.go @@ -4,6 +4,7 @@ package externalcmd import ( + "errors" "fmt" "os" "os/exec" @@ -40,11 +41,11 @@ func (e *Cmd) runOSSpecific() error { if err == nil { return 0 } - ee, ok := err.(*exec.ExitError) - if !ok { - return 0 + var ee *exec.ExitError + if errors.As(err, &ee) { + ee.ExitCode() } - return ee.ExitCode() + return 0 }() }() diff --git a/internal/formatprocessor/ac3.go b/internal/formatprocessor/ac3.go index 90ef5aa3..95bf02c9 100644 --- a/internal/formatprocessor/ac3.go +++ b/internal/formatprocessor/ac3.go @@ -1,6 +1,7 @@ package formatprocessor import ( + "errors" "fmt" "time" @@ -98,7 +99,8 @@ func (t *formatProcessorAC3) ProcessRTPPacket( //nolint:dupl frames, err := t.decoder.Decode(pkt) if err != nil { - if err == rtpac3.ErrNonStartingPacketAndNoPrevious || err == rtpac3.ErrMorePacketsNeeded { + if errors.Is(err, rtpac3.ErrNonStartingPacketAndNoPrevious) || + errors.Is(err, rtpac3.ErrMorePacketsNeeded) { return u, nil } return nil, err diff --git a/internal/formatprocessor/av1.go b/internal/formatprocessor/av1.go index 5d8b6418..6d4898b8 100644 --- a/internal/formatprocessor/av1.go +++ b/internal/formatprocessor/av1.go @@ -1,6 +1,7 @@ package formatprocessor //nolint:dupl import ( + "errors" "fmt" "time" @@ -100,7 +101,8 @@ func (t *formatProcessorAV1) ProcessRTPPacket( //nolint:dupl tu, err := t.decoder.Decode(pkt) if err != nil { - if err == rtpav1.ErrNonStartingPacketAndNoPrevious || err == rtpav1.ErrMorePacketsNeeded { + if errors.Is(err, rtpav1.ErrNonStartingPacketAndNoPrevious) || + errors.Is(err, rtpav1.ErrMorePacketsNeeded) { return u, nil } return nil, err diff --git a/internal/formatprocessor/h264.go b/internal/formatprocessor/h264.go index d5da5683..19c3691a 100644 --- a/internal/formatprocessor/h264.go +++ b/internal/formatprocessor/h264.go @@ -2,6 +2,7 @@ package formatprocessor import ( "bytes" + "errors" "time" "github.com/bluenviron/gortsplib/v4/pkg/format" @@ -284,7 +285,8 @@ func (t *formatProcessorH264) ProcessRTPPacket( //nolint:dupl } if err != nil { - if err == rtph264.ErrNonStartingPacketAndNoPrevious || err == rtph264.ErrMorePacketsNeeded { + if errors.Is(err, rtph264.ErrNonStartingPacketAndNoPrevious) || + errors.Is(err, rtph264.ErrMorePacketsNeeded) { return u, nil } return nil, err diff --git a/internal/formatprocessor/h265.go b/internal/formatprocessor/h265.go index 7258b1eb..486b6943 100644 --- a/internal/formatprocessor/h265.go +++ b/internal/formatprocessor/h265.go @@ -2,6 +2,7 @@ package formatprocessor import ( "bytes" + "errors" "time" "github.com/bluenviron/gortsplib/v4/pkg/format" @@ -303,7 +304,8 @@ func (t *formatProcessorH265) ProcessRTPPacket( //nolint:dupl } if err != nil { - if err == rtph265.ErrNonStartingPacketAndNoPrevious || err == rtph265.ErrMorePacketsNeeded { + if errors.Is(err, rtph265.ErrNonStartingPacketAndNoPrevious) || + errors.Is(err, rtph265.ErrMorePacketsNeeded) { return u, nil } return nil, err diff --git a/internal/formatprocessor/mjpeg.go b/internal/formatprocessor/mjpeg.go index 4dd5474a..57301919 100644 --- a/internal/formatprocessor/mjpeg.go +++ b/internal/formatprocessor/mjpeg.go @@ -1,6 +1,7 @@ package formatprocessor //nolint:dupl import ( + "errors" "fmt" "time" @@ -99,7 +100,8 @@ func (t *formatProcessorMJPEG) ProcessRTPPacket( //nolint:dupl frame, err := t.decoder.Decode(pkt) if err != nil { - if err == rtpmjpeg.ErrNonStartingPacketAndNoPrevious || err == rtpmjpeg.ErrMorePacketsNeeded { + if errors.Is(err, rtpmjpeg.ErrNonStartingPacketAndNoPrevious) || + errors.Is(err, rtpmjpeg.ErrMorePacketsNeeded) { return u, nil } return nil, err diff --git a/internal/formatprocessor/mpeg1_audio.go b/internal/formatprocessor/mpeg1_audio.go index 68b39b4c..0ee764aa 100644 --- a/internal/formatprocessor/mpeg1_audio.go +++ b/internal/formatprocessor/mpeg1_audio.go @@ -1,6 +1,7 @@ package formatprocessor //nolint:dupl import ( + "errors" "fmt" "time" @@ -98,7 +99,8 @@ func (t *formatProcessorMPEG1Audio) ProcessRTPPacket( //nolint:dupl frames, err := t.decoder.Decode(pkt) if err != nil { - if err == rtpmpeg1audio.ErrNonStartingPacketAndNoPrevious || err == rtpmpeg1audio.ErrMorePacketsNeeded { + if errors.Is(err, rtpmpeg1audio.ErrNonStartingPacketAndNoPrevious) || + errors.Is(err, rtpmpeg1audio.ErrMorePacketsNeeded) { return u, nil } return nil, err diff --git a/internal/formatprocessor/mpeg1_video.go b/internal/formatprocessor/mpeg1_video.go index 998b149f..47be0e30 100644 --- a/internal/formatprocessor/mpeg1_video.go +++ b/internal/formatprocessor/mpeg1_video.go @@ -1,6 +1,7 @@ package formatprocessor //nolint:dupl import ( + "errors" "fmt" "time" @@ -99,7 +100,8 @@ func (t *formatProcessorMPEG1Video) ProcessRTPPacket( //nolint:dupl frame, err := t.decoder.Decode(pkt) if err != nil { - if err == rtpmpeg1video.ErrNonStartingPacketAndNoPrevious || err == rtpmpeg1video.ErrMorePacketsNeeded { + if errors.Is(err, rtpmpeg1video.ErrNonStartingPacketAndNoPrevious) || + errors.Is(err, rtpmpeg1video.ErrMorePacketsNeeded) { return u, nil } return nil, err diff --git a/internal/formatprocessor/mpeg4_audio.go b/internal/formatprocessor/mpeg4_audio.go index 651760c6..bcdac2d4 100644 --- a/internal/formatprocessor/mpeg4_audio.go +++ b/internal/formatprocessor/mpeg4_audio.go @@ -1,6 +1,7 @@ package formatprocessor import ( + "errors" "fmt" "time" @@ -102,7 +103,7 @@ func (t *formatProcessorMPEG4Audio) ProcessRTPPacket( //nolint:dupl aus, err := t.decoder.Decode(pkt) if err != nil { - if err == rtpmpeg4audio.ErrMorePacketsNeeded { + if errors.Is(err, rtpmpeg4audio.ErrMorePacketsNeeded) { return u, nil } return nil, err diff --git a/internal/formatprocessor/mpeg4_video.go b/internal/formatprocessor/mpeg4_video.go index acdfca10..88872d0e 100644 --- a/internal/formatprocessor/mpeg4_video.go +++ b/internal/formatprocessor/mpeg4_video.go @@ -2,6 +2,7 @@ package formatprocessor //nolint:dupl import ( "bytes" + "errors" "fmt" "time" @@ -140,7 +141,7 @@ func (t *formatProcessorMPEG4Video) ProcessRTPPacket( //nolint:dupl frame, err := t.decoder.Decode(pkt) if err != nil { - if err == rtpmpeg4video.ErrMorePacketsNeeded { + if errors.Is(err, rtpmpeg4video.ErrMorePacketsNeeded) { return u, nil } return nil, err diff --git a/internal/formatprocessor/vp8.go b/internal/formatprocessor/vp8.go index f82c1660..990af8cb 100644 --- a/internal/formatprocessor/vp8.go +++ b/internal/formatprocessor/vp8.go @@ -1,6 +1,7 @@ package formatprocessor //nolint:dupl import ( + "errors" "fmt" "time" @@ -99,7 +100,8 @@ func (t *formatProcessorVP8) ProcessRTPPacket( //nolint:dupl frame, err := t.decoder.Decode(pkt) if err != nil { - if err == rtpvp8.ErrNonStartingPacketAndNoPrevious || err == rtpvp8.ErrMorePacketsNeeded { + if errors.Is(err, rtpvp8.ErrNonStartingPacketAndNoPrevious) || + errors.Is(err, rtpvp8.ErrMorePacketsNeeded) { return u, nil } return nil, err diff --git a/internal/formatprocessor/vp9.go b/internal/formatprocessor/vp9.go index 5b69d98d..91688cb5 100644 --- a/internal/formatprocessor/vp9.go +++ b/internal/formatprocessor/vp9.go @@ -1,6 +1,7 @@ package formatprocessor //nolint:dupl import ( + "errors" "fmt" "time" @@ -99,7 +100,8 @@ func (t *formatProcessorVP9) ProcessRTPPacket( //nolint:dupl frame, err := t.decoder.Decode(pkt) if err != nil { - if err == rtpvp9.ErrNonStartingPacketAndNoPrevious || err == rtpvp9.ErrMorePacketsNeeded { + if errors.Is(err, rtpvp9.ErrNonStartingPacketAndNoPrevious) || + errors.Is(err, rtpvp9.ErrMorePacketsNeeded) { return u, nil } return nil, err diff --git a/internal/protocols/rtmp/rawmessage/reader.go b/internal/protocols/rtmp/rawmessage/reader.go index ec4da620..37480934 100644 --- a/internal/protocols/rtmp/rawmessage/reader.go +++ b/internal/protocols/rtmp/rawmessage/reader.go @@ -311,7 +311,7 @@ func (r *Reader) Read() (*Message, error) { msg, err := rc.readMessage(typ) if err != nil { - if err == errMoreChunksNeeded { + if errors.Is(err, errMoreChunksNeeded) { continue } return nil, err diff --git a/internal/protocols/rtmp/reader.go b/internal/protocols/rtmp/reader.go index 7ccc741d..daee97db 100644 --- a/internal/protocols/rtmp/reader.go +++ b/internal/protocols/rtmp/reader.go @@ -2,6 +2,7 @@ package rtmp import ( "bytes" + "errors" "fmt" "time" @@ -111,7 +112,7 @@ func trackFromH264DecoderConfig(data []byte) (format.Format, error) { var conf h264conf.Conf err := conf.Unmarshal(data) if err != nil { - return nil, fmt.Errorf("unable to parse H264 config: %v", err) + return nil, fmt.Errorf("unable to parse H264 config: %w", err) } return &format.H264{ @@ -201,7 +202,7 @@ func tracksFromMetadata(conn *Conn, payload []interface{}) (format.Format, forma } else if msg.Type == message.VideoTypeAU && msg.IsKeyFrame { nalus, err := h264.AVCCUnmarshal(msg.Payload) if err != nil { - if err == h264.ErrAVCCNoNALUs { + if errors.Is(err, h264.ErrAVCCNoNALUs) { continue } return nil, nil, err @@ -249,7 +250,7 @@ func tracksFromMetadata(conn *Conn, payload []interface{}) (format.Format, forma var hvcc mp4.HvcC _, err := mp4.Unmarshal(bytes.NewReader(msg.Config), uint64(len(msg.Config)), &hvcc, mp4.Context{}) if err != nil { - return nil, nil, fmt.Errorf("invalid H265 configuration: %v", err) + return nil, nil, fmt.Errorf("invalid H265 configuration: %w", err) } vps := h265FindNALU(hvcc.NaluArrays, h265.NALUType_VPS_NUT) @@ -270,13 +271,13 @@ func tracksFromMetadata(conn *Conn, payload []interface{}) (format.Format, forma var av1c mp4.Av1C _, err := mp4.Unmarshal(bytes.NewReader(msg.Config), uint64(len(msg.Config)), &av1c, mp4.Context{}) if err != nil { - return nil, nil, fmt.Errorf("invalid AV1 configuration: %v", err) + return nil, nil, fmt.Errorf("invalid AV1 configuration: %w", err) } // parse sequence header and metadata contained in ConfigOBUs, but do not use them _, err = av1.BitstreamUnmarshal(av1c.ConfigOBUs, false) if err != nil { - return nil, nil, fmt.Errorf("invalid AV1 configuration: %v", err) + return nil, nil, fmt.Errorf("invalid AV1 configuration: %w", err) } videoTrack = &format.AV1{ @@ -287,7 +288,7 @@ func tracksFromMetadata(conn *Conn, payload []interface{}) (format.Format, forma var vpcc mp4.VpcC _, err := mp4.Unmarshal(bytes.NewReader(msg.Config), uint64(len(msg.Config)), &vpcc, mp4.Context{}) if err != nil { - return nil, nil, fmt.Errorf("invalid VP9 configuration: %v", err) + return nil, nil, fmt.Errorf("invalid VP9 configuration: %w", err) } videoTrack = &format.VP9{ @@ -464,7 +465,7 @@ func (r *Reader) OnDataAV1(cb OnDataAV1Func) { if msg, ok := msg.(*message.ExtendedCodedFrames); ok { tu, err := av1.BitstreamUnmarshal(msg.Payload, true) if err != nil { - return fmt.Errorf("unable to decode bitstream: %v", err) + return fmt.Errorf("unable to decode bitstream: %w", err) } cb(msg.DTS, tu) @@ -490,10 +491,10 @@ func (r *Reader) OnDataH265(cb OnDataH26xFunc) { case *message.Video: au, err := h264.AVCCUnmarshal(msg.Payload) if err != nil { - if err == h264.ErrAVCCNoNALUs { + if errors.Is(err, h264.ErrAVCCNoNALUs) { return nil } - return fmt.Errorf("unable to decode AVCC: %v", err) + return fmt.Errorf("unable to decode AVCC: %w", err) } cb(msg.DTS+msg.PTSDelta, au) @@ -501,10 +502,10 @@ func (r *Reader) OnDataH265(cb OnDataH26xFunc) { case *message.ExtendedFramesX: au, err := h264.AVCCUnmarshal(msg.Payload) if err != nil { - if err == h264.ErrAVCCNoNALUs { + if errors.Is(err, h264.ErrAVCCNoNALUs) { return nil } - return fmt.Errorf("unable to decode AVCC: %v", err) + return fmt.Errorf("unable to decode AVCC: %w", err) } cb(msg.DTS, au) @@ -512,10 +513,10 @@ func (r *Reader) OnDataH265(cb OnDataH26xFunc) { case *message.ExtendedCodedFrames: au, err := h264.AVCCUnmarshal(msg.Payload) if err != nil { - if err == h264.ErrAVCCNoNALUs { + if errors.Is(err, h264.ErrAVCCNoNALUs) { return nil } - return fmt.Errorf("unable to decode AVCC: %v", err) + return fmt.Errorf("unable to decode AVCC: %w", err) } cb(msg.DTS+msg.PTSDelta, au) @@ -534,7 +535,7 @@ func (r *Reader) OnDataH264(cb OnDataH26xFunc) { var conf h264conf.Conf err := conf.Unmarshal(msg.Payload) if err != nil { - return fmt.Errorf("unable to parse H264 config: %v", err) + return fmt.Errorf("unable to parse H264 config: %w", err) } au := [][]byte{ @@ -547,10 +548,10 @@ func (r *Reader) OnDataH264(cb OnDataH26xFunc) { case message.VideoTypeAU: au, err := h264.AVCCUnmarshal(msg.Payload) if err != nil { - if err == h264.ErrAVCCNoNALUs { + if errors.Is(err, h264.ErrAVCCNoNALUs) { return nil } - return fmt.Errorf("unable to decode AVCC: %v", err) + return fmt.Errorf("unable to decode AVCC: %w", err) } cb(msg.DTS+msg.PTSDelta, au) diff --git a/internal/record/format_fmp4.go b/internal/record/format_fmp4.go index 57db81ea..4a5a4629 100644 --- a/internal/record/format_fmp4.go +++ b/internal/record/format_fmp4.go @@ -729,13 +729,13 @@ func (f *formatFMP4) initialize() { var syncInfo ac3.SyncInfo err := syncInfo.Unmarshal(frame) if err != nil { - return fmt.Errorf("invalid AC-3 frame: %s", err) + return fmt.Errorf("invalid AC-3 frame: %w", err) } var bsi ac3.BSI err = bsi.Unmarshal(frame[5:]) if err != nil { - return fmt.Errorf("invalid AC-3 frame: %s", err) + return fmt.Errorf("invalid AC-3 frame: %w", err) } if !parsed { diff --git a/internal/servers/hls/http_server.go b/internal/servers/hls/http_server.go index bfba4c45..9d918ea8 100644 --- a/internal/servers/hls/http_server.go +++ b/internal/servers/hls/http_server.go @@ -2,6 +2,7 @@ package hls import ( _ "embed" + "errors" "fmt" "net" "net/http" @@ -158,7 +159,8 @@ func (s *httpServer) onRequest(ctx *gin.Context) { }, }) if res.Err != nil { - if terr, ok := res.Err.(*defs.ErrAuthentication); ok { + var terr defs.AuthenticationError + if errors.As(res.Err, &terr) { if !hasCredentials { ctx.Header("WWW-Authenticate", `Basic realm="mediamtx"`) ctx.Writer.WriteHeader(http.StatusUnauthorized) diff --git a/internal/servers/hls/muxer.go b/internal/servers/hls/muxer.go index 75f2620e..522035e2 100644 --- a/internal/servers/hls/muxer.go +++ b/internal/servers/hls/muxer.go @@ -269,7 +269,7 @@ func (m *muxer) runInner(innerCtx context.Context, innerReady chan struct{}) err err := m.muxer.Start() if err != nil { - return fmt.Errorf("muxer error: %v", err) + return fmt.Errorf("muxer error: %w", err) } defer m.muxer.Close() @@ -318,7 +318,7 @@ func (m *muxer) createVideoTrack(stream *stream.Stream) (*description.Media, *go err := m.muxer.WriteAV1(tunit.NTP, tunit.PTS, tunit.TU) if err != nil { - return fmt.Errorf("muxer error: %v", err) + return fmt.Errorf("muxer error: %w", err) } return nil @@ -342,7 +342,7 @@ func (m *muxer) createVideoTrack(stream *stream.Stream) (*description.Media, *go err := m.muxer.WriteVP9(tunit.NTP, tunit.PTS, tunit.Frame) if err != nil { - return fmt.Errorf("muxer error: %v", err) + return fmt.Errorf("muxer error: %w", err) } return nil @@ -366,7 +366,7 @@ func (m *muxer) createVideoTrack(stream *stream.Stream) (*description.Media, *go err := m.muxer.WriteH26x(tunit.NTP, tunit.PTS, tunit.AU) if err != nil { - return fmt.Errorf("muxer error: %v", err) + return fmt.Errorf("muxer error: %w", err) } return nil @@ -396,7 +396,7 @@ func (m *muxer) createVideoTrack(stream *stream.Stream) (*description.Media, *go err := m.muxer.WriteH26x(tunit.NTP, tunit.PTS, tunit.AU) if err != nil { - return fmt.Errorf("muxer error: %v", err) + return fmt.Errorf("muxer error: %w", err) } return nil @@ -428,7 +428,7 @@ func (m *muxer) createAudioTrack(stream *stream.Stream) (*description.Media, *go tunit.PTS, tunit.Packets) if err != nil { - return fmt.Errorf("muxer error: %v", err) + return fmt.Errorf("muxer error: %w", err) } return nil @@ -462,7 +462,7 @@ func (m *muxer) createAudioTrack(stream *stream.Stream) (*description.Media, *go tunit.PTS, tunit.AUs) if err != nil { - return fmt.Errorf("muxer error: %v", err) + return fmt.Errorf("muxer error: %w", err) } return nil diff --git a/internal/servers/rtmp/conn.go b/internal/servers/rtmp/conn.go index 26a52f0e..e0813b52 100644 --- a/internal/servers/rtmp/conn.go +++ b/internal/servers/rtmp/conn.go @@ -179,7 +179,8 @@ func (c *conn) runRead(conn *rtmp.Conn, u *url.URL) error { }) if res.Err != nil { - if terr, ok := res.Err.(*defs.ErrAuthentication); ok { + var terr defs.AuthenticationError + if errors.As(res.Err, &terr) { // wait some seconds to stop brute force attacks <-time.After(rtmpPauseAfterAuthError) return terr @@ -410,7 +411,8 @@ func (c *conn) runPublish(conn *rtmp.Conn, u *url.URL) error { }) if res.Err != nil { - if terr, ok := res.Err.(*defs.ErrAuthentication); ok { + var terr defs.AuthenticationError + if errors.As(res.Err, &terr) { // wait some seconds to stop brute force attacks <-time.After(rtmpPauseAfterAuthError) return terr diff --git a/internal/servers/rtsp/conn.go b/internal/servers/rtsp/conn.go index db28fdb4..f4897df7 100644 --- a/internal/servers/rtsp/conn.go +++ b/internal/servers/rtsp/conn.go @@ -1,6 +1,7 @@ package rtsp import ( + "errors" "fmt" "net" "time" @@ -138,21 +139,22 @@ func (c *conn) onDescribe(ctx *gortsplib.ServerHandlerOnDescribeCtx, }) if res.Err != nil { - switch terr := res.Err.(type) { - case *defs.ErrAuthentication: + var terr defs.AuthenticationError + if errors.As(res.Err, &terr) { res, err := c.handleAuthError(terr) return res, nil, err + } - case defs.ErrPathNoOnePublishing: + var terr2 defs.PathNoOnePublishingError + if errors.As(res.Err, &terr2) { return &base.Response{ StatusCode: base.StatusNotFound, }, nil, res.Err - - default: - return &base.Response{ - StatusCode: base.StatusBadRequest, - }, nil, res.Err } + + return &base.Response{ + StatusCode: base.StatusBadRequest, + }, nil, res.Err } if res.Redirect != "" { diff --git a/internal/servers/rtsp/session.go b/internal/servers/rtsp/session.go index 9acf167b..b4995bf0 100644 --- a/internal/servers/rtsp/session.go +++ b/internal/servers/rtsp/session.go @@ -2,6 +2,7 @@ package rtsp import ( "encoding/hex" + "errors" "fmt" "net" "sync" @@ -125,15 +126,14 @@ func (s *session) onAnnounce(c *conn, ctx *gortsplib.ServerHandlerOnAnnounceCtx) }) if res.Err != nil { - switch terr := res.Err.(type) { - case *defs.ErrAuthentication: + var terr defs.AuthenticationError + if errors.As(res.Err, &terr) { return c.handleAuthError(terr) - - default: - return &base.Response{ - StatusCode: base.StatusBadRequest, - }, res.Err } + + return &base.Response{ + StatusCode: base.StatusBadRequest, + }, res.Err } s.path = res.Path @@ -211,21 +211,22 @@ func (s *session) onSetup(c *conn, ctx *gortsplib.ServerHandlerOnSetupCtx, }) if res.Err != nil { - switch terr := res.Err.(type) { - case *defs.ErrAuthentication: + var terr defs.AuthenticationError + if errors.As(res.Err, &terr) { res, err := c.handleAuthError(terr) return res, nil, err + } - case defs.ErrPathNoOnePublishing: + var terr2 defs.PathNoOnePublishingError + if errors.As(res.Err, &terr2) { return &base.Response{ StatusCode: base.StatusNotFound, }, nil, res.Err - - default: - return &base.Response{ - StatusCode: base.StatusBadRequest, - }, nil, res.Err } + + return &base.Response{ + StatusCode: base.StatusBadRequest, + }, nil, res.Err } s.path = res.Path diff --git a/internal/servers/srt/conn.go b/internal/servers/srt/conn.go index 38238996..67bce4cb 100644 --- a/internal/servers/srt/conn.go +++ b/internal/servers/srt/conn.go @@ -195,7 +195,8 @@ func (c *conn) runPublish(req srtNewConnReq, pathName string, user string, pass }) if res.Err != nil { - if terr, ok := res.Err.(*defs.ErrAuthentication); ok { + var terr defs.AuthenticationError + if errors.As(res.Err, &terr) { // TODO: re-enable. Currently this freezes the listener. // wait some seconds to stop brute force attacks // <-time.After(srtPauseAfterAuthError) @@ -294,11 +295,12 @@ func (c *conn) runRead(req srtNewConnReq, pathName string, user string, pass str }) if res.Err != nil { - if terr, ok := res.Err.(*defs.ErrAuthentication); ok { + var terr defs.AuthenticationError + if errors.As(res.Err, &terr) { // TODO: re-enable. Currently this freezes the listener. // wait some seconds to stop brute force attacks // <-time.After(srtPauseAfterAuthError) - return false, terr + return false, res.Err } return false, res.Err } diff --git a/internal/servers/webrtc/http_server.go b/internal/servers/webrtc/http_server.go index 2b7d4e5c..6de9785c 100644 --- a/internal/servers/webrtc/http_server.go +++ b/internal/servers/webrtc/http_server.go @@ -2,6 +2,7 @@ package webrtc import ( _ "embed" + "errors" "fmt" "io" "net" @@ -123,7 +124,8 @@ func (s *httpServer) checkAuthOutsideSession(ctx *gin.Context, path string, publ }, }) if res.Err != nil { - if terr, ok := res.Err.(*defs.ErrAuthentication); ok { + var terr defs.AuthenticationError + if errors.As(res.Err, &terr) { if !hasCredentials { ctx.Header("WWW-Authenticate", `Basic realm="mediamtx"`) ctx.Writer.WriteHeader(http.StatusUnauthorized) diff --git a/internal/servers/webrtc/session.go b/internal/servers/webrtc/session.go index 142021b0..fb81dec2 100644 --- a/internal/servers/webrtc/session.go +++ b/internal/servers/webrtc/session.go @@ -3,6 +3,7 @@ package webrtc import ( "context" "encoding/hex" + "errors" "fmt" "net" "net/http" @@ -368,7 +369,8 @@ func (s *session) runPublish() (int, error) { }, }) if res.Err != nil { - if _, ok := res.Err.(*defs.ErrAuthentication); ok { + var terr defs.AuthenticationError + if errors.As(res.Err, &terr) { // wait some seconds to stop brute force attacks <-time.After(webrtcPauseAfterAuthError) @@ -498,7 +500,8 @@ func (s *session) runRead() (int, error) { }, }) if res.Err != nil { - if _, ok := res.Err.(*defs.ErrAuthentication); ok { + var terr defs.AuthenticationError + if errors.As(res.Err, &terr) { // wait some seconds to stop brute force attacks <-time.After(webrtcPauseAfterAuthError)