test
This commit is contained in:
		| @@ -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 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 deepch
					deepch