From 94218d5221e4ec4337bdca7d93dfc786099e6679 Mon Sep 17 00:00:00 2001 From: joestarzxh Date: Fri, 9 Jul 2021 00:05:05 +0800 Subject: [PATCH 1/4] =?UTF-8?q?[fix]=20=E4=BF=AE=E6=AD=A3rtsp=E8=AE=BA?= =?UTF-8?q?=E8=AF=81=E5=90=8C=E6=97=B6=E5=AD=98=E5=9C=A8Digest=EF=BC=8CBas?= =?UTF-8?q?ic=E6=97=B6=E4=BC=98=E5=85=88Digest=E8=AE=BA=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 2 +- pkg/httpflv/client_pull_session.go | 2 +- pkg/rtsp/auth.go | 20 +++++++++++++++++--- pkg/rtsp/client_command_session.go | 15 +++++++++------ pkg/rtsp/server_command_session.go | 20 ++++++++++---------- 5 files changed, 38 insertions(+), 21 deletions(-) diff --git a/go.mod b/go.mod index 8df8e7b..92ba118 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,4 @@ module github.com/q191201771/lal go 1.13 -require github.com/q191201771/naza v0.19.2 +require github.com/q191201771/naza v0.19.3 diff --git a/pkg/httpflv/client_pull_session.go b/pkg/httpflv/client_pull_session.go index 1d12ee1..3047d8c 100644 --- a/pkg/httpflv/client_pull_session.go +++ b/pkg/httpflv/client_pull_session.go @@ -225,7 +225,7 @@ func (session *PullSession) writeHttpRequest() error { return err } -func (session *PullSession) readHttpRespHeader() (statusLine string, headers map[string]string, err error) { +func (session *PullSession) readHttpRespHeader() (statusLine string, headers map[string][]string, err error) { // TODO chef: timeout if statusLine, headers, err = nazahttp.ReadHttpHeader(session.conn); err != nil { return diff --git a/pkg/rtsp/auth.go b/pkg/rtsp/auth.go index c87288d..8e38939 100644 --- a/pkg/rtsp/auth.go +++ b/pkg/rtsp/auth.go @@ -34,12 +34,26 @@ type Auth struct { Algorithm string } -func (a *Auth) FeedWwwAuthenticate(s, username, password string) { +func (a *Auth) FeedWwwAuthenticate(auths []string, username, password string) { a.Username = username a.Password = password + var s string + if len(auths) > 1 { + for _, s = range auths { + s = strings.TrimPrefix(s, HeaderWwwAuthenticate) + s = strings.TrimSpace(s) + if strings.HasPrefix(s, AuthTypeDigest) { + break + } + } + } else if len(auths) == 1 { + s = auths[0] + s = strings.TrimPrefix(s, HeaderWwwAuthenticate) + s = strings.TrimSpace(s) + } else { + return + } - s = strings.TrimPrefix(s, HeaderWwwAuthenticate) - s = strings.TrimSpace(s) if strings.HasPrefix(s, AuthTypeBasic) { a.Typ = AuthTypeBasic return diff --git a/pkg/rtsp/client_command_session.go b/pkg/rtsp/client_command_session.go index 574077a..9fb9505 100644 --- a/pkg/rtsp/client_command_session.go +++ b/pkg/rtsp/client_command_session.go @@ -341,11 +341,14 @@ func (session *ClientCommandSession) writeOptions() error { return err } - methods := ctx.Headers[HeaderPublic] - if methods == "" { + methods, ok := ctx.Headers[HeaderPublic] + if !ok { return nil } - if strings.Contains(methods, MethodGetParameter) { + if methods[0] == "" { + return nil + } + if strings.Contains(methods[0], MethodGetParameter) { session.methodGetParameterSupported = true } return nil @@ -428,9 +431,9 @@ func (session *ClientCommandSession) writeOneSetup(setupUri string) error { return err } - session.sessionId = strings.Split(ctx.Headers[HeaderSession], ";")[0] + session.sessionId = strings.Split(ctx.Headers[HeaderSession][0], ";")[0] - rRtpPort, rRtcpPort, err := parseServerPort(ctx.Headers[HeaderTransport]) + rRtpPort, rRtcpPort, err := parseServerPort(ctx.Headers[HeaderTransport][0]) if err != nil { return err } @@ -480,7 +483,7 @@ func (session *ClientCommandSession) writeOneSetupTcp(setupUri string) error { return err } - session.sessionId = strings.Split(ctx.Headers[HeaderSession], ";")[0] + session.sessionId = strings.Split(ctx.Headers[HeaderSession][0], ";")[0] // TODO chef: 这里没有解析回传的channel id了,因为我假定了它和request中的是一致的 session.observer.OnSetupWithChannel(setupUri, rtpChannel, rtcpChannel) diff --git a/pkg/rtsp/server_command_session.go b/pkg/rtsp/server_command_session.go index 8c2dfea..3a201e8 100644 --- a/pkg/rtsp/server_command_session.go +++ b/pkg/rtsp/server_command_session.go @@ -189,7 +189,7 @@ Loop: func (session *ServerCommandSession) handleOptions(requestCtx nazahttp.HttpReqMsgCtx) error { nazalog.Infof("[%s] < R OPTIONS", session.uniqueKey) - resp := PackResponseOptions(requestCtx.Headers[HeaderCSeq]) + resp := PackResponseOptions(requestCtx.Headers[HeaderCSeq][0]) _, err := session.conn.Write([]byte(resp)) return err } @@ -218,7 +218,7 @@ func (session *ServerCommandSession) handleAnnounce(requestCtx nazahttp.HttpReqM return ErrRtsp } - resp := PackResponseAnnounce(requestCtx.Headers[HeaderCSeq]) + resp := PackResponseAnnounce(requestCtx.Headers[HeaderCSeq][0]) _, err = session.conn.Write([]byte(resp)) return err } @@ -243,7 +243,7 @@ func (session *ServerCommandSession) handleDescribe(requestCtx nazahttp.HttpReqM sdpLogicCtx, _ := sdp.ParseSdp2LogicContext(rawSdp) session.subSession.InitWithSdp(rawSdp, sdpLogicCtx) - resp := PackResponseDescribe(requestCtx.Headers[HeaderCSeq], string(rawSdp)) + resp := PackResponseDescribe(requestCtx.Headers[HeaderCSeq][0], string(rawSdp)) _, err = session.conn.Write([]byte(resp)) return err } @@ -256,7 +256,7 @@ func (session *ServerCommandSession) handleSetup(requestCtx nazahttp.HttpReqMsgC host, _, _ := net.SplitHostPort(remoteAddr) // 是否为interleaved模式 - htv := requestCtx.Headers[HeaderTransport] + htv := requestCtx.Headers[HeaderTransport][0] if strings.Contains(htv, TransportFieldInterleaved) { rtpChannel, rtcpChannel, err := parseRtpRtcpChannel(htv) if err != nil { @@ -278,12 +278,12 @@ func (session *ServerCommandSession) handleSetup(requestCtx nazahttp.HttpReqMsgC return ErrRtsp } - resp := PackResponseSetup(requestCtx.Headers[HeaderCSeq], htv) + resp := PackResponseSetup(requestCtx.Headers[HeaderCSeq][0], htv) _, err = session.conn.Write([]byte(resp)) return err } - rRtpPort, rRtcpPort, err := parseClientPort(requestCtx.Headers[HeaderTransport]) + rRtpPort, rRtcpPort, err := parseClientPort(requestCtx.Headers[HeaderTransport][0]) if err != nil { nazalog.Errorf("[%s] parseClientPort failed. err=%+v", session.uniqueKey, err) return err @@ -313,14 +313,14 @@ func (session *ServerCommandSession) handleSetup(requestCtx nazahttp.HttpReqMsgC return ErrRtsp } - resp := PackResponseSetup(requestCtx.Headers[HeaderCSeq], htv) + resp := PackResponseSetup(requestCtx.Headers[HeaderCSeq][0], htv) _, err = session.conn.Write([]byte(resp)) return err } func (session *ServerCommandSession) handleRecord(requestCtx nazahttp.HttpReqMsgCtx) error { nazalog.Infof("[%s] < R RECORD", session.uniqueKey) - resp := PackResponseRecord(requestCtx.Headers[HeaderCSeq]) + resp := PackResponseRecord(requestCtx.Headers[HeaderCSeq][0]) _, err := session.conn.Write([]byte(resp)) return err } @@ -330,14 +330,14 @@ func (session *ServerCommandSession) handlePlay(requestCtx nazahttp.HttpReqMsgCt if ok := session.observer.OnNewRtspSubSessionPlay(session.subSession); !ok { return ErrRtsp } - resp := PackResponsePlay(requestCtx.Headers[HeaderCSeq]) + resp := PackResponsePlay(requestCtx.Headers[HeaderCSeq][0]) _, err := session.conn.Write([]byte(resp)) return err } func (session *ServerCommandSession) handleTeardown(requestCtx nazahttp.HttpReqMsgCtx) error { nazalog.Infof("[%s] < R TEARDOWN", session.uniqueKey) - resp := PackResponseTeardown(requestCtx.Headers[HeaderCSeq]) + resp := PackResponseTeardown(requestCtx.Headers[HeaderCSeq][0]) _, err := session.conn.Write([]byte(resp)) return err } From a224057363b6a83c06100607a04c9b71600067e1 Mon Sep 17 00:00:00 2001 From: joestarzxh Date: Fri, 9 Jul 2021 10:41:48 +0800 Subject: [PATCH 2/4] =?UTF-8?q?[fix]rtsp=E8=AE=BA=E8=AF=81=E5=8F=AA?= =?UTF-8?q?=E5=8F=96=E7=AC=AC=E4=B8=80=E4=B8=AAwwwAuthenticate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.sum | 4 ++-- pkg/httpflv/client_pull_session.go | 2 +- pkg/rtsp/auth.go | 20 +++----------------- pkg/rtsp/client_command_session.go | 20 +++++++++----------- pkg/rtsp/server_command_session.go | 20 ++++++++++---------- 5 files changed, 25 insertions(+), 41 deletions(-) diff --git a/go.sum b/go.sum index afb649e..0914ec0 100644 --- a/go.sum +++ b/go.sum @@ -1,2 +1,2 @@ -github.com/q191201771/naza v0.19.2 h1:DcOkkgvURCAs/wc/RQ1unlWmVO1ygaRHM/NySn7Y/X8= -github.com/q191201771/naza v0.19.2/go.mod h1:5LeGupZZFtYP1g/S203n9vXoUNVdlRnPIfM6rExjqt0= +github.com/q191201771/naza v0.19.3 h1:cvjBztFJjvqbr8uSFkFFKq39HgA4ryC7z6qTY4y8ayI= +github.com/q191201771/naza v0.19.3/go.mod h1:5LeGupZZFtYP1g/S203n9vXoUNVdlRnPIfM6rExjqt0= diff --git a/pkg/httpflv/client_pull_session.go b/pkg/httpflv/client_pull_session.go index 3047d8c..238a4ee 100644 --- a/pkg/httpflv/client_pull_session.go +++ b/pkg/httpflv/client_pull_session.go @@ -225,7 +225,7 @@ func (session *PullSession) writeHttpRequest() error { return err } -func (session *PullSession) readHttpRespHeader() (statusLine string, headers map[string][]string, err error) { +func (session *PullSession) readHttpRespHeader() (statusLine string, headers nazahttp.HttpHeaders, err error) { // TODO chef: timeout if statusLine, headers, err = nazahttp.ReadHttpHeader(session.conn); err != nil { return diff --git a/pkg/rtsp/auth.go b/pkg/rtsp/auth.go index 8e38939..b4b639d 100644 --- a/pkg/rtsp/auth.go +++ b/pkg/rtsp/auth.go @@ -34,26 +34,12 @@ type Auth struct { Algorithm string } -func (a *Auth) FeedWwwAuthenticate(auths []string, username, password string) { +func (a *Auth) FeedWwwAuthenticate(s string, username, password string) { a.Username = username a.Password = password - var s string - if len(auths) > 1 { - for _, s = range auths { - s = strings.TrimPrefix(s, HeaderWwwAuthenticate) - s = strings.TrimSpace(s) - if strings.HasPrefix(s, AuthTypeDigest) { - break - } - } - } else if len(auths) == 1 { - s = auths[0] - s = strings.TrimPrefix(s, HeaderWwwAuthenticate) - s = strings.TrimSpace(s) - } else { - return - } + s = strings.TrimPrefix(s, HeaderWwwAuthenticate) + s = strings.TrimSpace(s) if strings.HasPrefix(s, AuthTypeBasic) { a.Typ = AuthTypeBasic return diff --git a/pkg/rtsp/client_command_session.go b/pkg/rtsp/client_command_session.go index 9fb9505..7c19060 100644 --- a/pkg/rtsp/client_command_session.go +++ b/pkg/rtsp/client_command_session.go @@ -341,14 +341,12 @@ func (session *ClientCommandSession) writeOptions() error { return err } - methods, ok := ctx.Headers[HeaderPublic] - if !ok { - return nil - } - if methods[0] == "" { + method := ctx.Headers.Value(HeaderPublic) + + if method== "" { return nil } - if strings.Contains(methods[0], MethodGetParameter) { + if strings.Contains(method, MethodGetParameter) { session.methodGetParameterSupported = true } return nil @@ -431,9 +429,9 @@ func (session *ClientCommandSession) writeOneSetup(setupUri string) error { return err } - session.sessionId = strings.Split(ctx.Headers[HeaderSession][0], ";")[0] + session.sessionId = strings.Split(ctx.Headers.Value(HeaderSession), ";")[0] - rRtpPort, rRtcpPort, err := parseServerPort(ctx.Headers[HeaderTransport][0]) + rRtpPort, rRtcpPort, err := parseServerPort(ctx.Headers.Value(HeaderTransport)) if err != nil { return err } @@ -483,7 +481,7 @@ func (session *ClientCommandSession) writeOneSetupTcp(setupUri string) error { return err } - session.sessionId = strings.Split(ctx.Headers[HeaderSession][0], ";")[0] + session.sessionId = strings.Split(ctx.Headers.Value(HeaderSession), ";")[0] // TODO chef: 这里没有解析回传的channel id了,因为我假定了它和request中的是一致的 session.observer.OnSetupWithChannel(setupUri, rtpChannel, rtcpChannel) @@ -552,8 +550,8 @@ func (session *ClientCommandSession) writeCmdReadResp(method, uri string, header if ctx.StatusCode != "401" { return } - - session.auth.FeedWwwAuthenticate(ctx.Headers[HeaderWwwAuthenticate], session.urlCtx.Username, session.urlCtx.Password) + //目前只处理第一个 + session.auth.FeedWwwAuthenticate(ctx.Headers.Value(HeaderWwwAuthenticate), session.urlCtx.Username, session.urlCtx.Password) } err = ErrRtsp diff --git a/pkg/rtsp/server_command_session.go b/pkg/rtsp/server_command_session.go index 3a201e8..d5c9394 100644 --- a/pkg/rtsp/server_command_session.go +++ b/pkg/rtsp/server_command_session.go @@ -189,7 +189,7 @@ Loop: func (session *ServerCommandSession) handleOptions(requestCtx nazahttp.HttpReqMsgCtx) error { nazalog.Infof("[%s] < R OPTIONS", session.uniqueKey) - resp := PackResponseOptions(requestCtx.Headers[HeaderCSeq][0]) + resp := PackResponseOptions(requestCtx.Headers.Value(HeaderCSeq)) _, err := session.conn.Write([]byte(resp)) return err } @@ -218,7 +218,7 @@ func (session *ServerCommandSession) handleAnnounce(requestCtx nazahttp.HttpReqM return ErrRtsp } - resp := PackResponseAnnounce(requestCtx.Headers[HeaderCSeq][0]) + resp := PackResponseAnnounce(requestCtx.Headers.Value(HeaderCSeq)) _, err = session.conn.Write([]byte(resp)) return err } @@ -243,7 +243,7 @@ func (session *ServerCommandSession) handleDescribe(requestCtx nazahttp.HttpReqM sdpLogicCtx, _ := sdp.ParseSdp2LogicContext(rawSdp) session.subSession.InitWithSdp(rawSdp, sdpLogicCtx) - resp := PackResponseDescribe(requestCtx.Headers[HeaderCSeq][0], string(rawSdp)) + resp := PackResponseDescribe(requestCtx.Headers.Value(HeaderCSeq), string(rawSdp)) _, err = session.conn.Write([]byte(resp)) return err } @@ -256,7 +256,7 @@ func (session *ServerCommandSession) handleSetup(requestCtx nazahttp.HttpReqMsgC host, _, _ := net.SplitHostPort(remoteAddr) // 是否为interleaved模式 - htv := requestCtx.Headers[HeaderTransport][0] + htv := requestCtx.Headers.Value(HeaderTransport) if strings.Contains(htv, TransportFieldInterleaved) { rtpChannel, rtcpChannel, err := parseRtpRtcpChannel(htv) if err != nil { @@ -278,12 +278,12 @@ func (session *ServerCommandSession) handleSetup(requestCtx nazahttp.HttpReqMsgC return ErrRtsp } - resp := PackResponseSetup(requestCtx.Headers[HeaderCSeq][0], htv) + resp := PackResponseSetup(requestCtx.Headers.Value(HeaderCSeq), htv) _, err = session.conn.Write([]byte(resp)) return err } - rRtpPort, rRtcpPort, err := parseClientPort(requestCtx.Headers[HeaderTransport][0]) + rRtpPort, rRtcpPort, err := parseClientPort(requestCtx.Headers.Value(HeaderTransport)) if err != nil { nazalog.Errorf("[%s] parseClientPort failed. err=%+v", session.uniqueKey, err) return err @@ -313,14 +313,14 @@ func (session *ServerCommandSession) handleSetup(requestCtx nazahttp.HttpReqMsgC return ErrRtsp } - resp := PackResponseSetup(requestCtx.Headers[HeaderCSeq][0], htv) + resp := PackResponseSetup(requestCtx.Headers.Value(HeaderCSeq), htv) _, err = session.conn.Write([]byte(resp)) return err } func (session *ServerCommandSession) handleRecord(requestCtx nazahttp.HttpReqMsgCtx) error { nazalog.Infof("[%s] < R RECORD", session.uniqueKey) - resp := PackResponseRecord(requestCtx.Headers[HeaderCSeq][0]) + resp := PackResponseRecord(requestCtx.Headers.Value(HeaderCSeq)) _, err := session.conn.Write([]byte(resp)) return err } @@ -330,14 +330,14 @@ func (session *ServerCommandSession) handlePlay(requestCtx nazahttp.HttpReqMsgCt if ok := session.observer.OnNewRtspSubSessionPlay(session.subSession); !ok { return ErrRtsp } - resp := PackResponsePlay(requestCtx.Headers[HeaderCSeq][0]) + resp := PackResponsePlay(requestCtx.Headers.Value(HeaderCSeq)) _, err := session.conn.Write([]byte(resp)) return err } func (session *ServerCommandSession) handleTeardown(requestCtx nazahttp.HttpReqMsgCtx) error { nazalog.Infof("[%s] < R TEARDOWN", session.uniqueKey) - resp := PackResponseTeardown(requestCtx.Headers[HeaderCSeq][0]) + resp := PackResponseTeardown(requestCtx.Headers.Value(HeaderCSeq)) _, err := session.conn.Write([]byte(resp)) return err } From 264a53f6671e383673028290054593e1452c5e99 Mon Sep 17 00:00:00 2001 From: joestarzxh Date: Fri, 9 Jul 2021 15:09:12 +0800 Subject: [PATCH 3/4] =?UTF-8?q?[feat]=E4=BD=BF=E7=94=A8=E5=AE=98=E6=96=B9?= =?UTF-8?q?=20http.Header=20=E6=9B=BF=E6=8D=A2=E5=8E=9F=E6=9D=A5http?= =?UTF-8?q?=E7=9A=84=E5=A4=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/httpflv/client_pull_session.go | 3 ++- pkg/rtsp/client_command_session.go | 10 +++++----- pkg/rtsp/server_command_session.go | 20 ++++++++++---------- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/pkg/httpflv/client_pull_session.go b/pkg/httpflv/client_pull_session.go index 238a4ee..ab811cd 100644 --- a/pkg/httpflv/client_pull_session.go +++ b/pkg/httpflv/client_pull_session.go @@ -12,6 +12,7 @@ import ( "context" "fmt" "net" + "net/http" "time" "github.com/q191201771/lal/pkg/base" @@ -225,7 +226,7 @@ func (session *PullSession) writeHttpRequest() error { return err } -func (session *PullSession) readHttpRespHeader() (statusLine string, headers nazahttp.HttpHeaders, err error) { +func (session *PullSession) readHttpRespHeader() (statusLine string, headers http.Header, err error) { // TODO chef: timeout if statusLine, headers, err = nazahttp.ReadHttpHeader(session.conn); err != nil { return diff --git a/pkg/rtsp/client_command_session.go b/pkg/rtsp/client_command_session.go index 7c19060..64dcb89 100644 --- a/pkg/rtsp/client_command_session.go +++ b/pkg/rtsp/client_command_session.go @@ -341,7 +341,7 @@ func (session *ClientCommandSession) writeOptions() error { return err } - method := ctx.Headers.Value(HeaderPublic) + method := ctx.Headers.Get(HeaderPublic) if method== "" { return nil @@ -429,9 +429,9 @@ func (session *ClientCommandSession) writeOneSetup(setupUri string) error { return err } - session.sessionId = strings.Split(ctx.Headers.Value(HeaderSession), ";")[0] + session.sessionId = strings.Split(ctx.Headers.Get(HeaderSession), ";")[0] - rRtpPort, rRtcpPort, err := parseServerPort(ctx.Headers.Value(HeaderTransport)) + rRtpPort, rRtcpPort, err := parseServerPort(ctx.Headers.Get(HeaderTransport)) if err != nil { return err } @@ -481,7 +481,7 @@ func (session *ClientCommandSession) writeOneSetupTcp(setupUri string) error { return err } - session.sessionId = strings.Split(ctx.Headers.Value(HeaderSession), ";")[0] + session.sessionId = strings.Split(ctx.Headers.Get(HeaderSession), ";")[0] // TODO chef: 这里没有解析回传的channel id了,因为我假定了它和request中的是一致的 session.observer.OnSetupWithChannel(setupUri, rtpChannel, rtcpChannel) @@ -551,7 +551,7 @@ func (session *ClientCommandSession) writeCmdReadResp(method, uri string, header return } //目前只处理第一个 - session.auth.FeedWwwAuthenticate(ctx.Headers.Value(HeaderWwwAuthenticate), session.urlCtx.Username, session.urlCtx.Password) + session.auth.FeedWwwAuthenticate(ctx.Headers.Get(HeaderWwwAuthenticate), session.urlCtx.Username, session.urlCtx.Password) } err = ErrRtsp diff --git a/pkg/rtsp/server_command_session.go b/pkg/rtsp/server_command_session.go index d5c9394..8073cea 100644 --- a/pkg/rtsp/server_command_session.go +++ b/pkg/rtsp/server_command_session.go @@ -189,7 +189,7 @@ Loop: func (session *ServerCommandSession) handleOptions(requestCtx nazahttp.HttpReqMsgCtx) error { nazalog.Infof("[%s] < R OPTIONS", session.uniqueKey) - resp := PackResponseOptions(requestCtx.Headers.Value(HeaderCSeq)) + resp := PackResponseOptions(requestCtx.Headers.Get(HeaderCSeq)) _, err := session.conn.Write([]byte(resp)) return err } @@ -218,7 +218,7 @@ func (session *ServerCommandSession) handleAnnounce(requestCtx nazahttp.HttpReqM return ErrRtsp } - resp := PackResponseAnnounce(requestCtx.Headers.Value(HeaderCSeq)) + resp := PackResponseAnnounce(requestCtx.Headers.Get(HeaderCSeq)) _, err = session.conn.Write([]byte(resp)) return err } @@ -243,7 +243,7 @@ func (session *ServerCommandSession) handleDescribe(requestCtx nazahttp.HttpReqM sdpLogicCtx, _ := sdp.ParseSdp2LogicContext(rawSdp) session.subSession.InitWithSdp(rawSdp, sdpLogicCtx) - resp := PackResponseDescribe(requestCtx.Headers.Value(HeaderCSeq), string(rawSdp)) + resp := PackResponseDescribe(requestCtx.Headers.Get(HeaderCSeq), string(rawSdp)) _, err = session.conn.Write([]byte(resp)) return err } @@ -256,7 +256,7 @@ func (session *ServerCommandSession) handleSetup(requestCtx nazahttp.HttpReqMsgC host, _, _ := net.SplitHostPort(remoteAddr) // 是否为interleaved模式 - htv := requestCtx.Headers.Value(HeaderTransport) + htv := requestCtx.Headers.Get(HeaderTransport) if strings.Contains(htv, TransportFieldInterleaved) { rtpChannel, rtcpChannel, err := parseRtpRtcpChannel(htv) if err != nil { @@ -278,12 +278,12 @@ func (session *ServerCommandSession) handleSetup(requestCtx nazahttp.HttpReqMsgC return ErrRtsp } - resp := PackResponseSetup(requestCtx.Headers.Value(HeaderCSeq), htv) + resp := PackResponseSetup(requestCtx.Headers.Get(HeaderCSeq), htv) _, err = session.conn.Write([]byte(resp)) return err } - rRtpPort, rRtcpPort, err := parseClientPort(requestCtx.Headers.Value(HeaderTransport)) + rRtpPort, rRtcpPort, err := parseClientPort(requestCtx.Headers.Get(HeaderTransport)) if err != nil { nazalog.Errorf("[%s] parseClientPort failed. err=%+v", session.uniqueKey, err) return err @@ -313,14 +313,14 @@ func (session *ServerCommandSession) handleSetup(requestCtx nazahttp.HttpReqMsgC return ErrRtsp } - resp := PackResponseSetup(requestCtx.Headers.Value(HeaderCSeq), htv) + resp := PackResponseSetup(requestCtx.Headers.Get(HeaderCSeq), htv) _, err = session.conn.Write([]byte(resp)) return err } func (session *ServerCommandSession) handleRecord(requestCtx nazahttp.HttpReqMsgCtx) error { nazalog.Infof("[%s] < R RECORD", session.uniqueKey) - resp := PackResponseRecord(requestCtx.Headers.Value(HeaderCSeq)) + resp := PackResponseRecord(requestCtx.Headers.Get(HeaderCSeq)) _, err := session.conn.Write([]byte(resp)) return err } @@ -330,14 +330,14 @@ func (session *ServerCommandSession) handlePlay(requestCtx nazahttp.HttpReqMsgCt if ok := session.observer.OnNewRtspSubSessionPlay(session.subSession); !ok { return ErrRtsp } - resp := PackResponsePlay(requestCtx.Headers.Value(HeaderCSeq)) + resp := PackResponsePlay(requestCtx.Headers.Get(HeaderCSeq)) _, err := session.conn.Write([]byte(resp)) return err } func (session *ServerCommandSession) handleTeardown(requestCtx nazahttp.HttpReqMsgCtx) error { nazalog.Infof("[%s] < R TEARDOWN", session.uniqueKey) - resp := PackResponseTeardown(requestCtx.Headers.Value(HeaderCSeq)) + resp := PackResponseTeardown(requestCtx.Headers.Get(HeaderCSeq)) _, err := session.conn.Write([]byte(resp)) return err } From 34d33ac02630f5456b60f186f3dac8b842eabf62 Mon Sep 17 00:00:00 2001 From: joestarzxh Date: Fri, 9 Jul 2021 17:12:01 +0800 Subject: [PATCH 4/4] =?UTF-8?q?[feat]FeedWwwAuthenticate=E4=B8=AD=E4=BC=A0?= =?UTF-8?q?=E9=80=92string=E5=88=87=E7=89=87=EF=BC=8Crtsp=E8=AE=BA?= =?UTF-8?q?=E8=AF=81=E9=80=BB=E8=BE=91=E6=9C=89=E6=AD=A4=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/rtsp/auth.go | 12 +++++++++--- pkg/rtsp/client_command_session.go | 4 ++-- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/pkg/rtsp/auth.go b/pkg/rtsp/auth.go index b4b639d..7b8627b 100644 --- a/pkg/rtsp/auth.go +++ b/pkg/rtsp/auth.go @@ -34,11 +34,17 @@ type Auth struct { Algorithm string } -func (a *Auth) FeedWwwAuthenticate(s string, username, password string) { +func (a *Auth) FeedWwwAuthenticate(auths []string, username, password string) { a.Username = username a.Password = password - - s = strings.TrimPrefix(s, HeaderWwwAuthenticate) + //目前只处理第一个 + var s string + if len(auths)>0{ + s = auths[0] + }else{ + return + } + s = strings.TrimPrefix(s, HeaderWwwAuthenticate) s = strings.TrimSpace(s) if strings.HasPrefix(s, AuthTypeBasic) { a.Typ = AuthTypeBasic diff --git a/pkg/rtsp/client_command_session.go b/pkg/rtsp/client_command_session.go index 64dcb89..2783540 100644 --- a/pkg/rtsp/client_command_session.go +++ b/pkg/rtsp/client_command_session.go @@ -550,8 +550,8 @@ func (session *ClientCommandSession) writeCmdReadResp(method, uri string, header if ctx.StatusCode != "401" { return } - //目前只处理第一个 - session.auth.FeedWwwAuthenticate(ctx.Headers.Get(HeaderWwwAuthenticate), session.urlCtx.Username, session.urlCtx.Password) + + session.auth.FeedWwwAuthenticate(ctx.Headers.Values(HeaderWwwAuthenticate), session.urlCtx.Username, session.urlCtx.Password) } err = ErrRtsp