mirror of
https://github.com/AlexxIT/go2rtc.git
synced 2025-10-22 07:50:45 +08:00
Fix redirect for rtspx source #565
This commit is contained in:
@@ -1,14 +1,11 @@
|
||||
package rtmp
|
||||
|
||||
import (
|
||||
"crypto/tls"
|
||||
"errors"
|
||||
"net"
|
||||
"net/url"
|
||||
"strings"
|
||||
|
||||
"github.com/AlexxIT/go2rtc/pkg/core"
|
||||
"github.com/AlexxIT/go2rtc/pkg/flv"
|
||||
"github.com/AlexxIT/go2rtc/pkg/tcp"
|
||||
)
|
||||
|
||||
func Dial(rawURL string) (core.Producer, error) {
|
||||
@@ -17,38 +14,11 @@ func Dial(rawURL string) (core.Producer, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var hostname string // without port
|
||||
if i := strings.IndexByte(u.Host, ':'); i > 0 {
|
||||
hostname = u.Host[:i]
|
||||
} else {
|
||||
hostname = u.Host
|
||||
u.Host += ":1935"
|
||||
}
|
||||
|
||||
conn, err := net.DialTimeout("tcp", u.Host, core.ConnDialTimeout)
|
||||
conn, err := tcp.Dial(u, "1935")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if u.Scheme != "rtmp" {
|
||||
var conf *tls.Config
|
||||
|
||||
switch {
|
||||
case u.Scheme == "rtmpx" || net.ParseIP(hostname) != nil:
|
||||
conf = &tls.Config{InsecureSkipVerify: true}
|
||||
case u.Scheme == "rtmps":
|
||||
conf = &tls.Config{ServerName: hostname}
|
||||
default:
|
||||
return nil, errors.New("unsupported scheme: " + u.Scheme)
|
||||
}
|
||||
|
||||
tlsConn := tls.Client(conn, conf)
|
||||
if err = tlsConn.Handshake(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
conn = tlsConn
|
||||
}
|
||||
|
||||
rd, err := NewReader(u, conn)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
@@ -24,19 +24,18 @@ func NewClient(uri string) *Conn {
|
||||
}
|
||||
|
||||
func (c *Conn) Dial() (err error) {
|
||||
var conn net.Conn
|
||||
|
||||
if c.Transport == "" {
|
||||
conn, err = Dial(c.uri)
|
||||
} else {
|
||||
conn, err = websocket.Dial(c.Transport)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
if c.URL, err = url.Parse(c.uri); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if c.URL, err = url.Parse(c.uri); err != nil {
|
||||
var conn net.Conn
|
||||
|
||||
if c.Transport == "" {
|
||||
conn, err = tcp.Dial(c.URL, "554")
|
||||
} else {
|
||||
conn, err = websocket.Dial(c.Transport)
|
||||
}
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
|
@@ -1,44 +0,0 @@
|
||||
package rtsp
|
||||
|
||||
import (
|
||||
"crypto/tls"
|
||||
"errors"
|
||||
"net"
|
||||
"net/url"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
func Dial(uri string) (net.Conn, error) {
|
||||
u, err := url.Parse(uri)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
switch u.Scheme {
|
||||
case "rtsp":
|
||||
return dialTCP(u.Host, nil)
|
||||
case "rtsps":
|
||||
tlsConf := &tls.Config{ServerName: u.Hostname()}
|
||||
return dialTCP(u.Host, tlsConf)
|
||||
case "rtspx":
|
||||
tlsConf := &tls.Config{InsecureSkipVerify: true}
|
||||
return dialTCP(u.Host, tlsConf)
|
||||
}
|
||||
|
||||
return nil, errors.New("unsupported scheme: " + u.Scheme)
|
||||
}
|
||||
|
||||
func dialTCP(address string, tlsConf *tls.Config) (net.Conn, error) {
|
||||
if strings.IndexByte(address, ':') < 0 {
|
||||
address += ":554"
|
||||
}
|
||||
|
||||
conn, err := net.DialTimeout("tcp", address, time.Second*5)
|
||||
if tlsConf == nil || err != nil {
|
||||
return conn, err
|
||||
}
|
||||
|
||||
tlsConn := tls.Client(conn, tlsConf)
|
||||
return tlsConn, tlsConn.Handshake()
|
||||
}
|
56
pkg/tcp/dial.go
Normal file
56
pkg/tcp/dial.go
Normal file
@@ -0,0 +1,56 @@
|
||||
package tcp
|
||||
|
||||
import (
|
||||
"crypto/tls"
|
||||
"errors"
|
||||
"net"
|
||||
"net/url"
|
||||
"strings"
|
||||
|
||||
"github.com/AlexxIT/go2rtc/pkg/core"
|
||||
)
|
||||
|
||||
// Dial - for RTSP(S|X) and RTMP(S|X)
|
||||
func Dial(u *url.URL, port string) (net.Conn, error) {
|
||||
var hostname string // without port
|
||||
if i := strings.IndexByte(u.Host, ':'); i > 0 {
|
||||
hostname = u.Host[:i]
|
||||
} else {
|
||||
hostname = u.Host
|
||||
u.Host += ":" + port
|
||||
}
|
||||
|
||||
var secure *tls.Config
|
||||
|
||||
switch u.Scheme {
|
||||
case "rtsp", "rtmp":
|
||||
case "rtsps", "rtspx", "rtmps", "rtmpx":
|
||||
if u.Scheme[4] == 'x' || net.ParseIP(hostname) != nil {
|
||||
secure = &tls.Config{InsecureSkipVerify: true}
|
||||
} else {
|
||||
secure = &tls.Config{ServerName: hostname}
|
||||
}
|
||||
default:
|
||||
return nil, errors.New("unsupported scheme: " + u.Scheme)
|
||||
}
|
||||
|
||||
conn, err := net.DialTimeout("tcp", u.Host, core.ConnDialTimeout)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if secure == nil {
|
||||
return conn, nil
|
||||
}
|
||||
|
||||
tlsConn := tls.Client(conn, secure)
|
||||
if err = tlsConn.Handshake(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if u.Scheme[4] == 'x' {
|
||||
u.Scheme = u.Scheme[:4] + "s"
|
||||
}
|
||||
|
||||
return tlsConn, nil
|
||||
}
|
Reference in New Issue
Block a user