mirror of
https://github.com/datarhei/core.git
synced 2025-09-26 12:01:30 +08:00
Add support for SRTv4 clients
Older clients (e.g. Makito encoders) don't support streamid and couldn't send a stream. This adds support for v4 clients. Such clients will always be publishing to the resource equal to the client address, e.g. 192.168.1.42:63793 Clients that want to play this stream are required to send a streamid with the respective resource name.
This commit is contained in:
76
srt/srt.go
76
srt/srt.go
@@ -468,15 +468,44 @@ func (s *server) handleConnect(req srt.ConnRequest) srt.ConnType {
|
||||
client := req.RemoteAddr()
|
||||
streamId := req.StreamId()
|
||||
|
||||
si, err := parseStreamId(streamId)
|
||||
if err != nil {
|
||||
s.log("CONNECT", "INVALID", "", err.Error(), client)
|
||||
return srt.REJECT
|
||||
}
|
||||
var si streamInfo
|
||||
var err error
|
||||
|
||||
if len(si.resource) == 0 {
|
||||
s.log("CONNECT", "INVALID", "", "stream resource not provided", client)
|
||||
return srt.REJECT
|
||||
if req.Version() == 4 {
|
||||
si.mode = "publish"
|
||||
si.resource = client.String()
|
||||
|
||||
if len(s.passphrase) != 0 {
|
||||
req.SetPassphrase(s.passphrase)
|
||||
}
|
||||
} else if req.Version() == 5 {
|
||||
si, err = parseStreamId(streamId)
|
||||
if err != nil {
|
||||
s.log("CONNECT", "INVALID", "", err.Error(), client)
|
||||
return srt.REJECT
|
||||
}
|
||||
|
||||
if len(si.resource) == 0 {
|
||||
s.log("CONNECT", "INVALID", "", "stream resource not provided", client)
|
||||
return srt.REJECT
|
||||
}
|
||||
|
||||
if len(s.passphrase) != 0 {
|
||||
if !req.IsEncrypted() {
|
||||
s.log("CONNECT", "FORBIDDEN", si.resource, "connection has to be encrypted", client)
|
||||
return srt.REJECT
|
||||
}
|
||||
|
||||
if err := req.SetPassphrase(s.passphrase); err != nil {
|
||||
s.log("CONNECT", "FORBIDDEN", si.resource, err.Error(), client)
|
||||
return srt.REJECT
|
||||
}
|
||||
} else {
|
||||
if req.IsEncrypted() {
|
||||
s.log("CONNECT", "INVALID", si.resource, "connection must not be encrypted", client)
|
||||
return srt.REJECT
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if si.mode == "publish" {
|
||||
@@ -488,26 +517,13 @@ func (s *server) handleConnect(req srt.ConnRequest) srt.ConnType {
|
||||
return srt.REJECT
|
||||
}
|
||||
|
||||
if len(s.passphrase) != 0 {
|
||||
if !req.IsEncrypted() {
|
||||
s.log("CONNECT", "FORBIDDEN", si.resource, "connection has to be encrypted", client)
|
||||
return srt.REJECT
|
||||
}
|
||||
|
||||
if err := req.SetPassphrase(s.passphrase); err != nil {
|
||||
s.log("CONNECT", "FORBIDDEN", si.resource, err.Error(), client)
|
||||
return srt.REJECT
|
||||
}
|
||||
} else {
|
||||
if req.IsEncrypted() {
|
||||
s.log("CONNECT", "INVALID", si.resource, "connection must not be encrypted", client)
|
||||
return srt.REJECT
|
||||
}
|
||||
}
|
||||
|
||||
// Check the token
|
||||
if len(s.token) != 0 && s.token != si.token {
|
||||
s.log("CONNECT", "FORBIDDEN", si.resource, "invalid token ("+si.token+")", client)
|
||||
if len(si.token) == 0 {
|
||||
s.log("CONNECT", "FORBIDDEN", si.resource, "token required", client)
|
||||
} else {
|
||||
s.log("CONNECT", "FORBIDDEN", si.resource, "invalid token ("+si.token+")", client)
|
||||
}
|
||||
return srt.REJECT
|
||||
}
|
||||
|
||||
@@ -532,7 +548,13 @@ func (s *server) handlePublish(conn srt.Conn) {
|
||||
streamId := conn.StreamId()
|
||||
client := conn.RemoteAddr()
|
||||
|
||||
si, _ := parseStreamId(streamId)
|
||||
var si streamInfo
|
||||
|
||||
if len(streamId) == 0 {
|
||||
si.resource = client.String()
|
||||
} else {
|
||||
si, _ = parseStreamId(streamId)
|
||||
}
|
||||
|
||||
// Look for the stream
|
||||
s.lock.Lock()
|
||||
|
Reference in New Issue
Block a user