mirror of
				https://github.com/aler9/rtsp-simple-server
				synced 2025-11-01 03:22:50 +08:00 
			
		
		
		
	rtmp: add handshake functions
This commit is contained in:
		| @@ -63,30 +63,7 @@ func TestClientHandshake(t *testing.T) { | |||||||
| 				defer conn.Close() | 				defer conn.Close() | ||||||
| 				bc := bytecounter.NewReadWriter(conn) | 				bc := bytecounter.NewReadWriter(conn) | ||||||
|  |  | ||||||
| 				// C->S handshake C0 | 				err = handshake.DoServer(bc) | ||||||
| 				err = handshake.C0S0{}.Read(bc) |  | ||||||
| 				require.NoError(t, err) |  | ||||||
|  |  | ||||||
| 				// C->S handshake C1 |  | ||||||
| 				c1 := handshake.C1S1{} |  | ||||||
| 				err = c1.Read(bc, true) |  | ||||||
| 				require.NoError(t, err) |  | ||||||
|  |  | ||||||
| 				// S->C handshake S0 |  | ||||||
| 				err = handshake.C0S0{}.Write(bc) |  | ||||||
| 				require.NoError(t, err) |  | ||||||
|  |  | ||||||
| 				// S->C handshake S1 |  | ||||||
| 				s1 := handshake.C1S1{} |  | ||||||
| 				err = s1.Write(bc, false) |  | ||||||
| 				require.NoError(t, err) |  | ||||||
|  |  | ||||||
| 				// S->C handshake S2 |  | ||||||
| 				err = handshake.C2S2{Digest: c1.Digest}.Write(bc) |  | ||||||
| 				require.NoError(t, err) |  | ||||||
|  |  | ||||||
| 				// C->S handshake C2 |  | ||||||
| 				err = (&handshake.C2S2{Digest: s1.Digest}).Read(bc) |  | ||||||
| 				require.NoError(t, err) | 				require.NoError(t, err) | ||||||
|  |  | ||||||
| 				mrw := message.NewReadWriter(bc) | 				mrw := message.NewReadWriter(bc) | ||||||
| @@ -345,30 +322,7 @@ func TestServerHandshake(t *testing.T) { | |||||||
| 			defer conn.Close() | 			defer conn.Close() | ||||||
| 			bc := bytecounter.NewReadWriter(conn) | 			bc := bytecounter.NewReadWriter(conn) | ||||||
|  |  | ||||||
| 			// C->S handshake C0 | 			err = handshake.DoClient(bc) | ||||||
| 			err = handshake.C0S0{}.Write(bc) |  | ||||||
| 			require.NoError(t, err) |  | ||||||
|  |  | ||||||
| 			// C->S handshake C1 |  | ||||||
| 			c1 := handshake.C1S1{} |  | ||||||
| 			err = c1.Write(bc, true) |  | ||||||
| 			require.NoError(t, err) |  | ||||||
|  |  | ||||||
| 			// S->C handshake S0 |  | ||||||
| 			err = handshake.C0S0{}.Read(bc) |  | ||||||
| 			require.NoError(t, err) |  | ||||||
|  |  | ||||||
| 			// S->C handshake S1 |  | ||||||
| 			s1 := handshake.C1S1{} |  | ||||||
| 			err = s1.Read(bc, false) |  | ||||||
| 			require.NoError(t, err) |  | ||||||
|  |  | ||||||
| 			// S->C handshake S2 |  | ||||||
| 			err = (&handshake.C2S2{Digest: c1.Digest}).Read(bc) |  | ||||||
| 			require.NoError(t, err) |  | ||||||
|  |  | ||||||
| 			// C->S handshake C2 |  | ||||||
| 			err = handshake.C2S2{Digest: s1.Digest}.Write(bc) |  | ||||||
| 			require.NoError(t, err) | 			require.NoError(t, err) | ||||||
|  |  | ||||||
| 			mrw := message.NewReadWriter(bc) | 			mrw := message.NewReadWriter(bc) | ||||||
| @@ -656,30 +610,7 @@ func TestReadTracks(t *testing.T) { | |||||||
| 			defer conn.Close() | 			defer conn.Close() | ||||||
| 			bc := bytecounter.NewReadWriter(conn) | 			bc := bytecounter.NewReadWriter(conn) | ||||||
|  |  | ||||||
| 			// C->S handshake C0 | 			err = handshake.DoClient(bc) | ||||||
| 			err = handshake.C0S0{}.Write(bc) |  | ||||||
| 			require.NoError(t, err) |  | ||||||
|  |  | ||||||
| 			// C->S handshake C1 |  | ||||||
| 			c1 := handshake.C1S1{} |  | ||||||
| 			err = c1.Write(bc, true) |  | ||||||
| 			require.NoError(t, err) |  | ||||||
|  |  | ||||||
| 			// S->C handshake S0 |  | ||||||
| 			err = handshake.C0S0{}.Read(bc) |  | ||||||
| 			require.NoError(t, err) |  | ||||||
|  |  | ||||||
| 			// S->C handshake S1 |  | ||||||
| 			s1 := handshake.C1S1{} |  | ||||||
| 			err = s1.Read(bc, false) |  | ||||||
| 			require.NoError(t, err) |  | ||||||
|  |  | ||||||
| 			// S->C handshake S2 |  | ||||||
| 			err = (&handshake.C2S2{Digest: c1.Digest}).Read(bc) |  | ||||||
| 			require.NoError(t, err) |  | ||||||
|  |  | ||||||
| 			// C->S handshake C2 |  | ||||||
| 			err = handshake.C2S2{Digest: s1.Digest}.Write(bc) |  | ||||||
| 			require.NoError(t, err) | 			require.NoError(t, err) | ||||||
|  |  | ||||||
| 			mrw := message.NewReadWriter(bc) | 			mrw := message.NewReadWriter(bc) | ||||||
| @@ -1061,30 +992,7 @@ func TestWriteTracks(t *testing.T) { | |||||||
| 	defer conn.Close() | 	defer conn.Close() | ||||||
| 	bc := bytecounter.NewReadWriter(conn) | 	bc := bytecounter.NewReadWriter(conn) | ||||||
|  |  | ||||||
| 	// C->S handshake C0 | 	err = handshake.DoClient(bc) | ||||||
| 	err = handshake.C0S0{}.Write(bc) |  | ||||||
| 	require.NoError(t, err) |  | ||||||
|  |  | ||||||
| 	// C-> handshake C1 |  | ||||||
| 	c1 := handshake.C1S1{} |  | ||||||
| 	err = c1.Write(bc, true) |  | ||||||
| 	require.NoError(t, err) |  | ||||||
|  |  | ||||||
| 	// S->C handshake S0 |  | ||||||
| 	err = handshake.C0S0{}.Read(bc) |  | ||||||
| 	require.NoError(t, err) |  | ||||||
|  |  | ||||||
| 	// S->C handshake S1 |  | ||||||
| 	s1 := handshake.C1S1{} |  | ||||||
| 	err = s1.Read(bc, false) |  | ||||||
| 	require.NoError(t, err) |  | ||||||
|  |  | ||||||
| 	// S->C handshake S2 |  | ||||||
| 	err = (&handshake.C2S2{Digest: c1.Digest}).Read(bc) |  | ||||||
| 	require.NoError(t, err) |  | ||||||
|  |  | ||||||
| 	// C->S handshake C2 |  | ||||||
| 	err = handshake.C2S2{Digest: s1.Digest}.Write(bc) |  | ||||||
| 	require.NoError(t, err) | 	require.NoError(t, err) | ||||||
|  |  | ||||||
| 	mrw := message.NewReadWriter(bc) | 	mrw := message.NewReadWriter(bc) | ||||||
|   | |||||||
							
								
								
									
										79
									
								
								internal/rtmp/handshake/handshake.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								internal/rtmp/handshake/handshake.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | |||||||
|  | package handshake | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"io" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // DoClient performs a client-side handshake. | ||||||
|  | func DoClient(rw io.ReadWriter) error { | ||||||
|  | 	err := C0S0{}.Write(rw) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	c1 := C1S1{} | ||||||
|  | 	err = c1.Write(rw, true) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	err = C0S0{}.Read(rw) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	s1 := C1S1{} | ||||||
|  | 	err = s1.Read(rw, false) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	err = (&C2S2{Digest: c1.Digest}).Read(rw) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	err = C2S2{Digest: s1.Digest}.Write(rw) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // DoServer performs a server-side handshake. | ||||||
|  | func DoServer(rw io.ReadWriter) error { | ||||||
|  | 	err := C0S0{}.Read(rw) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	c1 := C1S1{} | ||||||
|  | 	err = c1.Read(rw, true) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	err = C0S0{}.Write(rw) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	s1 := C1S1{} | ||||||
|  | 	err = s1.Write(rw, false) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	err = C2S2{Digest: c1.Digest}.Write(rw) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	err = (&C2S2{Digest: s1.Digest}).Read(rw) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
							
								
								
									
										36
									
								
								internal/rtmp/handshake/handshake_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								internal/rtmp/handshake/handshake_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,36 @@ | |||||||
|  | package handshake | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"net" | ||||||
|  | 	"testing" | ||||||
|  |  | ||||||
|  | 	"github.com/stretchr/testify/require" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func TestHandshake(t *testing.T) { | ||||||
|  | 	ln, err := net.Listen("tcp", "127.0.0.1:9122") | ||||||
|  | 	require.NoError(t, err) | ||||||
|  | 	defer ln.Close() | ||||||
|  |  | ||||||
|  | 	done := make(chan struct{}) | ||||||
|  |  | ||||||
|  | 	go func() { | ||||||
|  | 		conn, err := ln.Accept() | ||||||
|  | 		require.NoError(t, err) | ||||||
|  | 		defer conn.Close() | ||||||
|  |  | ||||||
|  | 		err = DoServer(conn) | ||||||
|  | 		require.NoError(t, err) | ||||||
|  |  | ||||||
|  | 		close(done) | ||||||
|  | 	}() | ||||||
|  |  | ||||||
|  | 	conn, err := net.Dial("tcp", "127.0.0.1:9122") | ||||||
|  | 	require.NoError(t, err) | ||||||
|  | 	defer conn.Close() | ||||||
|  |  | ||||||
|  | 	err = DoClient(conn) | ||||||
|  | 	require.NoError(t, err) | ||||||
|  |  | ||||||
|  | 	<-done | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user
	 aler9
					aler9