mirror of
				https://github.com/aler9/gortsplib
				synced 2025-11-01 02:52:36 +08:00 
			
		
		
		
	server: allow a TCP session to be used by another connection after PAUSE
This commit is contained in:
		| @@ -413,6 +413,7 @@ func (sc *ServerConn) handleRequest(req *base.Request) (*base.Response, error) { | ||||
| 			_, res, err := sc.handleRequestInSession(sxID, req, false) | ||||
|  | ||||
| 			if _, ok := err.(liberrors.ErrServerTCPFramesDisable); ok { | ||||
| 				sc.tcpSession = nil | ||||
| 				sc.tcpFrameSetEnabled = false | ||||
| 				return res, nil | ||||
| 			} | ||||
|   | ||||
| @@ -505,7 +505,10 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base | ||||
| 			Tracks:  tracks, | ||||
| 		}) | ||||
|  | ||||
| 		if res.StatusCode == base.StatusOK { | ||||
| 		if res.StatusCode != base.StatusOK { | ||||
| 			return res, err | ||||
| 		} | ||||
|  | ||||
| 		ss.state = ServerSessionStatePrePublish | ||||
| 		ss.setuppedPath = &path | ||||
| 		ss.setuppedQuery = &query | ||||
| @@ -522,8 +525,6 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base | ||||
|  | ||||
| 		v := time.Now().Unix() | ||||
| 		ss.udpLastFrameTime = &v | ||||
| 		} | ||||
|  | ||||
| 		return res, err | ||||
|  | ||||
| 	case base.Setup: | ||||
| @@ -648,7 +649,22 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base | ||||
| 			Transport: transport, | ||||
| 		}) | ||||
|  | ||||
| 		if res.StatusCode == base.StatusOK { | ||||
| 		// workaround to prevent a bug in rtspclientsink | ||||
| 		// that makes impossible for the client to receive the response | ||||
| 		// and send frames. | ||||
| 		// this was causing problems during unit tests. | ||||
| 		if ua, ok := req.Header["User-Agent"]; ok && len(ua) == 1 && | ||||
| 			strings.HasPrefix(ua[0], "GStreamer") { | ||||
| 			select { | ||||
| 			case <-time.After(1 * time.Second): | ||||
| 			case <-ss.ctx.Done(): | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if res.StatusCode != base.StatusOK { | ||||
| 			return res, err | ||||
| 		} | ||||
|  | ||||
| 		if ss.state == ServerSessionStateInitial { | ||||
| 			err := stream.readerAdd(ss, | ||||
| 				transport, | ||||
| @@ -729,19 +745,6 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base | ||||
| 		ss.setuppedTracks[trackID] = sst | ||||
|  | ||||
| 		res.Header["Transport"] = th.Write() | ||||
| 		} | ||||
|  | ||||
| 		// workaround to prevent a bug in rtspclientsink | ||||
| 		// that makes impossible for the client to receive the response | ||||
| 		// and send frames. | ||||
| 		// this was causing problems during unit tests. | ||||
| 		if ua, ok := req.Header["User-Agent"]; ok && len(ua) == 1 && | ||||
| 			strings.HasPrefix(ua[0], "GStreamer") { | ||||
| 			select { | ||||
| 			case <-time.After(1 * time.Second): | ||||
| 			case <-ss.ctx.Done(): | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return res, err | ||||
|  | ||||
| @@ -790,8 +793,14 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base | ||||
| 			Query:   query, | ||||
| 		}) | ||||
|  | ||||
| 		if ss.state != ServerSessionStateRead { | ||||
| 			if res.StatusCode == base.StatusOK { | ||||
| 		if res.StatusCode != base.StatusOK { | ||||
| 			return res, err | ||||
| 		} | ||||
|  | ||||
| 		if ss.state == ServerSessionStateRead { | ||||
| 			return res, err | ||||
| 		} | ||||
|  | ||||
| 		ss.state = ServerSessionStateRead | ||||
|  | ||||
| 		if *ss.setuppedTransport == TransportTCP { | ||||
| @@ -856,10 +865,6 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base | ||||
| 			err = liberrors.ErrServerTCPFramesEnable{} | ||||
| 		} | ||||
|  | ||||
| 				return res, err | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		return res, err | ||||
|  | ||||
| 	case base.Record: | ||||
| @@ -909,7 +914,11 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base | ||||
| 			Query:   query, | ||||
| 		}) | ||||
|  | ||||
| 		if res.StatusCode == base.StatusOK { | ||||
| 		if res.StatusCode != base.StatusOK { | ||||
| 			ss.tcpConn = nil | ||||
| 			return res, err | ||||
| 		} | ||||
|  | ||||
| 		ss.state = ServerSessionStatePublish | ||||
|  | ||||
| 		switch *ss.setuppedTransport { | ||||
| @@ -931,11 +940,6 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base | ||||
| 			err = liberrors.ErrServerTCPFramesEnable{} | ||||
| 		} | ||||
|  | ||||
| 			return res, err | ||||
| 		} | ||||
|  | ||||
| 		ss.tcpConn = nil | ||||
|  | ||||
| 		return res, err | ||||
|  | ||||
| 	case base.Pause: | ||||
| @@ -971,7 +975,10 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base | ||||
| 			Query:   query, | ||||
| 		}) | ||||
|  | ||||
| 		if res.StatusCode == base.StatusOK { | ||||
| 		if res.StatusCode != base.StatusOK { | ||||
| 			return res, err | ||||
| 		} | ||||
|  | ||||
| 		switch ss.state { | ||||
| 		case ServerSessionStateRead: | ||||
| 			ss.setuppedStream.readerSetInactive(ss) | ||||
| @@ -1004,7 +1011,6 @@ func (ss *ServerSession) handleRequest(sc *ServerConn, req *base.Request) (*base | ||||
| 				err = liberrors.ErrServerTCPFramesDisable{} | ||||
| 			} | ||||
| 		} | ||||
| 		} | ||||
|  | ||||
| 		return res, err | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 aler9
					aler9