This commit is contained in:
deepch 2023-05-25 13:07:13 +03:00
parent 9e244f72bf
commit 0b08aa7224

View File

@ -3,6 +3,7 @@ package rtspv2
import ( import (
"errors" "errors"
"fmt" "fmt"
"log"
"net" "net"
"net/url" "net/url"
"strconv" "strconv"
@ -25,6 +26,7 @@ type ProxyConn struct {
cseq int cseq int
session string session string
protocol int protocol int
in int
} }
type Proxy struct { type Proxy struct {
@ -40,7 +42,6 @@ func NewProxyConn(netconn net.Conn) *ProxyConn {
conn.writebuf = make([]byte, 4096) conn.writebuf = make([]byte, 4096)
conn.readbuf = make([]byte, 4096) conn.readbuf = make([]byte, 4096)
conn.session = uuid.New().String() conn.session = uuid.New().String()
conn.cseq = 1
return conn return conn
} }
@ -156,6 +157,7 @@ func (self *ProxyConn) prepare() error {
return errors.New("no fist cmd") return errors.New("no fist cmd")
} }
cseq := strings.TrimSpace(stringInBetween(string(self.readbuf[:n]), "CSeq:", "\r\n"))
switch fistStringsSlice[0] { switch fistStringsSlice[0] {
case OPTIONS: case OPTIONS:
@ -165,45 +167,47 @@ func (self *ProxyConn) prepare() error {
if self.URL, err = url.Parse(fistStringsSlice[1]); err != nil { if self.URL, err = url.Parse(fistStringsSlice[1]); err != nil {
return err return err
} }
_, err := self.netconn.Write([]byte("RTSP/1.0 200 OK\r\nPublic: OPTIONS, DESCRIBE, SETUP, PLAY\r\nSession: " + self.session + "\r\nCSeq: " + strconv.Itoa(self.cseq) + "\r\n\r\n")) _, err := self.netconn.Write([]byte("RTSP/1.0 200 OK\r\nPublic: OPTIONS, DESCRIBE, SETUP, PLAY\r\nSession: " + self.session + "\r\nCSeq: " + cseq + "\r\n\r\n"))
if err != nil { if err != nil {
return err return err
} }
self.options = true self.options = true
case SETUP: case SETUP:
if strings.Contains(string(self.readbuf[:n]), "RTP/AVP/UDP") { if strings.Contains(string(self.readbuf[:n]), "RTP/AVP/UDP") {
_, err := self.netconn.Write([]byte("RTSP/1.0 461 Unsupported transport\r\nCSeq: " + strconv.Itoa(self.cseq) + "\r\nSession: " + self.session + "\r\n\r\n")) _, err := self.netconn.Write([]byte("RTSP/1.0 461 Unsupported transport\r\nCSeq: " + cseq + "\r\nSession: " + self.session + "\r\n\r\n"))
if err != nil { if err != nil {
return err return err
} }
return nil return nil
} }
_, err := self.netconn.Write([]byte("RTSP/1.0 200 OK\r\nCSeq: " + strconv.Itoa(self.cseq) + "\r\nSession: " + self.session + "\r\nTransport: RTP/AVP/TCP;unicast;interleaved=0-1\r\n\r\n")) log.Println("RTSP/1.0 200 OK\r\nCSeq: " + cseq + "\r\nSession: " + self.session + "\r\nTransport: RTP/AVP/TCP;unicast;interleaved=" + strconv.Itoa(self.in) + "-" + strconv.Itoa(self.in+1) + "\r\n\r\n")
_, err := self.netconn.Write([]byte("RTSP/1.0 200 OK\r\nCSeq: " + cseq + "\r\nSession: " + self.session + "\r\nTransport: RTP/AVP/TCP;unicast;interleaved=" + strconv.Itoa(self.in) + "-" + strconv.Itoa(self.in+1) + "\r\n\r\n"))
if err != nil { if err != nil {
return err return err
} }
self.in = self.in + 2
case DESCRIBE: case DESCRIBE:
buf := "RTSP/1.0 200 OK\r\nContent-Type: application/sdp\r\nSession: " + self.session + "\r\nContent-Length: " + strconv.Itoa(len(self.sdp)) + "\r\nCSeq: " + strconv.Itoa(self.cseq) + "\r\n\r\n" buf := "RTSP/1.0 200 OK\r\nContent-Type: application/sdp\r\nSession: " + self.session + "\r\nContent-Length: " + strconv.Itoa(len(self.sdp)) + "\r\nCSeq: " + cseq + "\r\n\r\n"
_, err := self.netconn.Write([]byte(buf + string(self.sdp))) _, err := self.netconn.Write([]byte(buf + string(self.sdp)))
if err != nil { if err != nil {
return err return err
} }
case PLAY: case PLAY:
_, err := self.netconn.Write([]byte("RTSP/1.0 200 OK\r\nSession: " + self.session + ";timeout=60\r\nCSeq: " + cseq + "\r\n\r\n"))
_, err := self.netconn.Write([]byte("RTSP/1.0 200 OK\r\nSession: " + self.session + ";timeout=60\r\nCSeq: " + strconv.Itoa(self.cseq) + "\r\n\r\n"))
if err != nil { if err != nil {
return err return err
} }
self.playing = true self.playing = true
case TEARDOWN:
self.netconn.Close()
return errors.New("exit")
default: default:
return errors.New("metod not found") return errors.New("metod not found " + fistStringsSlice[0])
} }
return nil return nil