mirror of
https://github.com/aler9/gortsplib
synced 2025-10-03 14:26:42 +08:00
move host resolution from headers to client/server (#883)
This commit is contained in:
57
client.go
57
client.go
@@ -1867,8 +1867,17 @@ func (c *Client) doSetup(
|
|||||||
}
|
}
|
||||||
|
|
||||||
var remoteIP net.IP
|
var remoteIP net.IP
|
||||||
if thRes.Source != nil {
|
if thRes.Source2 != nil {
|
||||||
remoteIP = *thRes.Source
|
if ip := net.ParseIP(*thRes.Source2); ip != nil {
|
||||||
|
remoteIP = ip
|
||||||
|
} else {
|
||||||
|
var addr *net.UDPAddr
|
||||||
|
addr, err = net.ResolveUDPAddr("udp", *thRes.Source2)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("unable to solve source host: %w", err)
|
||||||
|
}
|
||||||
|
remoteIP = addr.IP
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
remoteIP = c.nconn.RemoteAddr().(*net.TCPAddr).IP
|
remoteIP = c.nconn.RemoteAddr().(*net.TCPAddr).IP
|
||||||
}
|
}
|
||||||
@@ -1902,21 +1911,41 @@ func (c *Client) doSetup(
|
|||||||
return nil, liberrors.ErrClientTransportHeaderInvalidDelivery{}
|
return nil, liberrors.ErrClientTransportHeaderInvalidDelivery{}
|
||||||
}
|
}
|
||||||
|
|
||||||
if thRes.Ports == nil {
|
|
||||||
return nil, liberrors.ErrClientTransportHeaderNoPorts{}
|
|
||||||
}
|
|
||||||
|
|
||||||
if thRes.Destination == nil {
|
|
||||||
return nil, liberrors.ErrClientTransportHeaderNoDestination{}
|
|
||||||
}
|
|
||||||
|
|
||||||
var remoteIP net.IP
|
var remoteIP net.IP
|
||||||
if thRes.Source != nil {
|
if thRes.Source2 != nil {
|
||||||
remoteIP = *thRes.Source
|
if ip := net.ParseIP(*thRes.Source2); ip != nil {
|
||||||
|
remoteIP = ip
|
||||||
|
} else {
|
||||||
|
var addr *net.UDPAddr
|
||||||
|
addr, err = net.ResolveUDPAddr("udp", *thRes.Source2)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("unable to solve source host: %w", err)
|
||||||
|
}
|
||||||
|
remoteIP = addr.IP
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
remoteIP = c.nconn.RemoteAddr().(*net.TCPAddr).IP
|
remoteIP = c.nconn.RemoteAddr().(*net.TCPAddr).IP
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var destIP net.IP
|
||||||
|
if thRes.Destination2 == nil {
|
||||||
|
return nil, liberrors.ErrClientTransportHeaderNoDestination{}
|
||||||
|
}
|
||||||
|
if ip := net.ParseIP(*thRes.Destination2); ip != nil {
|
||||||
|
destIP = ip
|
||||||
|
} else {
|
||||||
|
var addr *net.UDPAddr
|
||||||
|
addr, err = net.ResolveUDPAddr("udp", *thRes.Destination2)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("unable to solve destination host: %w", err)
|
||||||
|
}
|
||||||
|
destIP = addr.IP
|
||||||
|
}
|
||||||
|
|
||||||
|
if thRes.Ports == nil {
|
||||||
|
return nil, liberrors.ErrClientTransportHeaderNoPorts{}
|
||||||
|
}
|
||||||
|
|
||||||
var intf *net.Interface
|
var intf *net.Interface
|
||||||
intf, err = interfaceOfConn(c.nconn)
|
intf, err = interfaceOfConn(c.nconn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -1927,8 +1956,8 @@ func (c *Client) doSetup(
|
|||||||
c,
|
c,
|
||||||
true,
|
true,
|
||||||
intf,
|
intf,
|
||||||
net.JoinHostPort(thRes.Destination.String(), strconv.FormatInt(int64(thRes.Ports[0]), 10)),
|
net.JoinHostPort(destIP.String(), strconv.FormatInt(int64(thRes.Ports[0]), 10)),
|
||||||
net.JoinHostPort(thRes.Destination.String(), strconv.FormatInt(int64(thRes.Ports[1]), 10)),
|
net.JoinHostPort(destIP.String(), strconv.FormatInt(int64(thRes.Ports[1]), 10)),
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@@ -28,6 +28,10 @@ import (
|
|||||||
"github.com/bluenviron/mediacommon/v2/pkg/codecs/mpeg4audio"
|
"github.com/bluenviron/mediacommon/v2/pkg/codecs/mpeg4audio"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func stringPtr(v string) *string {
|
||||||
|
return &v
|
||||||
|
}
|
||||||
|
|
||||||
func ipPtr(v net.IP) *net.IP {
|
func ipPtr(v net.IP) *net.IP {
|
||||||
return &v
|
return &v
|
||||||
}
|
}
|
||||||
@@ -461,8 +465,7 @@ func TestClientPlay(t *testing.T) {
|
|||||||
v := headers.TransportDeliveryMulticast
|
v := headers.TransportDeliveryMulticast
|
||||||
th.Delivery = &v
|
th.Delivery = &v
|
||||||
th.Protocol = headers.TransportProtocolUDP
|
th.Protocol = headers.TransportProtocolUDP
|
||||||
v2 := net.ParseIP("224.1.0.1")
|
th.Destination2 = stringPtr("224.1.0.1")
|
||||||
th.Destination = &v2
|
|
||||||
th.Ports = &[2]int{25000 + i*2, 25001 + i*2}
|
th.Ports = &[2]int{25000 + i*2, 25001 + i*2}
|
||||||
|
|
||||||
l1s[i], err2 = net.ListenPacket("udp", net.JoinHostPort("224.0.0.0", strconv.FormatInt(int64(th.Ports[0]), 10)))
|
l1s[i], err2 = net.ListenPacket("udp", net.JoinHostPort("224.0.0.0", strconv.FormatInt(int64(th.Ports[0]), 10)))
|
||||||
|
2
pkg/headers/testdata/fuzz/FuzzKeyMgmtUnmarshal/e466018bd7205d8b
vendored
Normal file
2
pkg/headers/testdata/fuzz/FuzzKeyMgmtUnmarshal/e466018bd7205d8b
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
go test fuzz v1
|
||||||
|
string("prot=mikey;uri")
|
@@ -140,11 +140,21 @@ type Transport struct {
|
|||||||
Delivery *TransportDelivery
|
Delivery *TransportDelivery
|
||||||
|
|
||||||
// (optional) Source IP.
|
// (optional) Source IP.
|
||||||
|
//
|
||||||
|
// Deprecated: replaced by Source2
|
||||||
Source *net.IP
|
Source *net.IP
|
||||||
|
|
||||||
|
// (optional) Source IP/host.
|
||||||
|
Source2 *string
|
||||||
|
|
||||||
// (optional) destination IP.
|
// (optional) destination IP.
|
||||||
|
//
|
||||||
|
// Deprecated: replaced by Destination2
|
||||||
Destination *net.IP
|
Destination *net.IP
|
||||||
|
|
||||||
|
// (optional) destination IP/host.
|
||||||
|
Destination2 *string
|
||||||
|
|
||||||
// (optional) interleaved frame IDs.
|
// (optional) interleaved frame IDs.
|
||||||
InterleavedIDs *[2]int
|
InterleavedIDs *[2]int
|
||||||
|
|
||||||
@@ -220,27 +230,18 @@ func (h *Transport) Unmarshal(v base.HeaderValue) error {
|
|||||||
|
|
||||||
case "source":
|
case "source":
|
||||||
if v != "" {
|
if v != "" {
|
||||||
ip := net.ParseIP(v)
|
if ip := net.ParseIP(v); ip != nil {
|
||||||
if ip == nil {
|
h.Source = &ip
|
||||||
addrs, err2 := net.LookupHost(v)
|
|
||||||
if err2 != nil {
|
|
||||||
return fmt.Errorf("invalid source (%v)", v)
|
|
||||||
}
|
|
||||||
ip = net.ParseIP(addrs[0])
|
|
||||||
if ip == nil {
|
|
||||||
return fmt.Errorf("invalid source (%v)", v)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
h.Source = &ip
|
h.Source2 = &v
|
||||||
}
|
}
|
||||||
|
|
||||||
case "destination":
|
case "destination":
|
||||||
if v != "" {
|
if v != "" {
|
||||||
ip := net.ParseIP(v)
|
if ip := net.ParseIP(v); ip != nil {
|
||||||
if ip == nil {
|
h.Destination = &ip
|
||||||
return fmt.Errorf("invalid destination (%v)", v)
|
|
||||||
}
|
}
|
||||||
h.Destination = &ip
|
h.Destination2 = &v
|
||||||
}
|
}
|
||||||
|
|
||||||
case "interleaved":
|
case "interleaved":
|
||||||
@@ -351,11 +352,21 @@ func (h Transport) Marshal() base.HeaderValue {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if h.Source != nil {
|
if h.Source != nil {
|
||||||
rets = append(rets, "source="+h.Source.String())
|
v := h.Source.String()
|
||||||
|
h.Source2 = &v
|
||||||
|
}
|
||||||
|
|
||||||
|
if h.Source2 != nil {
|
||||||
|
rets = append(rets, "source="+*h.Source2)
|
||||||
}
|
}
|
||||||
|
|
||||||
if h.Destination != nil {
|
if h.Destination != nil {
|
||||||
rets = append(rets, "destination="+h.Destination.String())
|
v := h.Destination.String()
|
||||||
|
h.Destination2 = &v
|
||||||
|
}
|
||||||
|
|
||||||
|
if h.Destination2 != nil {
|
||||||
|
rets = append(rets, "destination="+*h.Destination2)
|
||||||
}
|
}
|
||||||
|
|
||||||
if h.InterleavedIDs != nil {
|
if h.InterleavedIDs != nil {
|
||||||
|
@@ -54,11 +54,12 @@ var casesTransport = []struct {
|
|||||||
base.HeaderValue{`RTP/AVP;multicast;destination=225.219.201.15;port=7000-7001;ttl=127`},
|
base.HeaderValue{`RTP/AVP;multicast;destination=225.219.201.15;port=7000-7001;ttl=127`},
|
||||||
base.HeaderValue{`RTP/AVP;multicast;destination=225.219.201.15;port=7000-7001;ttl=127`},
|
base.HeaderValue{`RTP/AVP;multicast;destination=225.219.201.15;port=7000-7001;ttl=127`},
|
||||||
Transport{
|
Transport{
|
||||||
Protocol: TransportProtocolUDP,
|
Protocol: TransportProtocolUDP,
|
||||||
Delivery: deliveryPtr(TransportDeliveryMulticast),
|
Delivery: deliveryPtr(TransportDeliveryMulticast),
|
||||||
Destination: ipPtr(net.ParseIP("225.219.201.15")),
|
Destination: ipPtr(net.ParseIP("225.219.201.15")),
|
||||||
TTL: uintPtr(127),
|
Destination2: stringPtr("225.219.201.15"),
|
||||||
Ports: &[2]int{7000, 7001},
|
TTL: uintPtr(127),
|
||||||
|
Ports: &[2]int{7000, 7001},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -94,6 +95,7 @@ var casesTransport = []struct {
|
|||||||
ClientPorts: &[2]int{14186, 14187},
|
ClientPorts: &[2]int{14186, 14187},
|
||||||
ServerPorts: &[2]int{5000, 5001},
|
ServerPorts: &[2]int{5000, 5001},
|
||||||
Source: ipPtr(net.ParseIP("127.0.0.1")),
|
Source: ipPtr(net.ParseIP("127.0.0.1")),
|
||||||
|
Source2: stringPtr("127.0.0.1"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -164,6 +166,7 @@ var casesTransport = []struct {
|
|||||||
Protocol: TransportProtocolUDP,
|
Protocol: TransportProtocolUDP,
|
||||||
Delivery: deliveryPtr(TransportDeliveryUnicast),
|
Delivery: deliveryPtr(TransportDeliveryUnicast),
|
||||||
Source: ipPtr(net.ParseIP("172.16.8.2")),
|
Source: ipPtr(net.ParseIP("172.16.8.2")),
|
||||||
|
Source2: stringPtr("172.16.8.2"),
|
||||||
ClientPorts: &[2]int{14236, 14237},
|
ClientPorts: &[2]int{14236, 14237},
|
||||||
ServerPorts: &[2]int{56002, 56003},
|
ServerPorts: &[2]int{56002, 56003},
|
||||||
},
|
},
|
||||||
|
@@ -914,7 +914,7 @@ func TestServerPlay(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
for _, intf := range intfs {
|
for _, intf := range intfs {
|
||||||
err = p.JoinGroup(&intf, &net.UDPAddr{IP: *th.Destination})
|
err = p.JoinGroup(&intf, &net.UDPAddr{IP: net.ParseIP(*th.Destination2)})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -928,7 +928,7 @@ func TestServerPlay(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
for _, intf := range intfs {
|
for _, intf := range intfs {
|
||||||
err = p.JoinGroup(&intf, &net.UDPAddr{IP: *th.Destination})
|
err = p.JoinGroup(&intf, &net.UDPAddr{IP: net.ParseIP(*th.Destination2)})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1042,7 +1042,7 @@ func TestServerPlay(t *testing.T) {
|
|||||||
|
|
||||||
case "multicast":
|
case "multicast":
|
||||||
_, err = l2.WriteTo(buf, &net.UDPAddr{
|
_, err = l2.WriteTo(buf, &net.UDPAddr{
|
||||||
IP: *th.Destination,
|
IP: net.ParseIP(*th.Destination2),
|
||||||
Port: th.Ports[1],
|
Port: th.Ports[1],
|
||||||
})
|
})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
@@ -1234,7 +1234,7 @@ func TestServerPlaySocketError(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
for _, intf := range intfs {
|
for _, intf := range intfs {
|
||||||
err = p.JoinGroup(&intf, &net.UDPAddr{IP: *th.Destination})
|
err = p.JoinGroup(&intf, &net.UDPAddr{IP: net.ParseIP(*th.Destination2)})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1248,7 +1248,7 @@ func TestServerPlaySocketError(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
for _, intf := range intfs {
|
for _, intf := range intfs {
|
||||||
err = p.JoinGroup(&intf, &net.UDPAddr{IP: *th.Destination})
|
err = p.JoinGroup(&intf, &net.UDPAddr{IP: net.ParseIP(*th.Destination2)})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1468,8 +1468,8 @@ func (ss *ServerSession) handleRequestInner(sc *ServerConn, req *base.Request) (
|
|||||||
th.Delivery = &de
|
th.Delivery = &de
|
||||||
v := uint(127)
|
v := uint(127)
|
||||||
th.TTL = &v
|
th.TTL = &v
|
||||||
d := stream.medias[medi].multicastWriter.ip()
|
dest := stream.medias[medi].multicastWriter.ip().String()
|
||||||
th.Destination = &d
|
th.Destination2 = &dest
|
||||||
th.Ports = &[2]int{ss.s.MulticastRTPPort, ss.s.MulticastRTCPPort}
|
th.Ports = &[2]int{ss.s.MulticastRTPPort, ss.s.MulticastRTCPPort}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user