소스 검색

Merge pull request #2303 from calmh/disco

Encapsulate local discovery address in struct
Audrius Butkevicius 10 년 전
부모
커밋
46d4f6037d
3개의 변경된 파일169개의 추가작업 그리고 90개의 파일을 삭제
  1. 8 3
      lib/discover/local.go
  2. 10 6
      lib/discover/localpackets.go
  3. 151 81
      lib/discover/localpackets_xdr.go

+ 8 - 3
lib/discover/local.go

@@ -117,7 +117,12 @@ func (c *localClient) Error() error {
 }
 
 func (c *localClient) announcementPkt() Announce {
-	addrs := c.addrList.AllAddresses()
+	var addrs []Address
+	for _, addr := range c.addrList.AllAddresses() {
+		addrs = append(addrs, Address{
+			URL: addr,
+		})
+	}
 
 	var relays []Relay
 	for _, relay := range c.relayStat.Relays() {
@@ -198,7 +203,7 @@ func (c *localClient) registerDevice(src net.Addr, device Device) bool {
 
 	var validAddresses []string
 	for _, addr := range device.Addresses {
-		u, err := url.Parse(addr)
+		u, err := url.Parse(addr.URL)
 		if err != nil {
 			continue
 		}
@@ -216,7 +221,7 @@ func (c *localClient) registerDevice(src net.Addr, device Device) bool {
 			u.Host = fmt.Sprintf("%s:%d", host, tcpAddr.Port)
 			validAddresses = append(validAddresses, u.String())
 		} else {
-			validAddresses = append(validAddresses, addr)
+			validAddresses = append(validAddresses, addr.URL)
 		}
 	}
 

+ 10 - 6
lib/discover/localpackets.go

@@ -19,13 +19,17 @@ type Announce struct {
 	Extra []Device // max:16
 }
 
+type Device struct {
+	ID        []byte    // max:32
+	Addresses []Address // max:16
+	Relays    []Relay   // max:16
+}
+
+type Address struct {
+	URL string // max:2083
+}
+
 type Relay struct {
 	URL     string `json:"url"` // max:2083
 	Latency int32  `json:"latency"`
 }
-
-type Device struct {
-	ID        []byte   // max:32
-	Addresses []string // max:16
-	Relays    []Relay  // max:16
-}

+ 151 - 81
lib/discover/localpackets_xdr.go

@@ -113,80 +113,6 @@ func (o *Announce) DecodeXDRFrom(xr *xdr.Reader) error {
 
 /*
 
-Relay Structure:
-
- 0                   1                   2                   3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-|                         Length of URL                         |
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-/                                                               /
-\                     URL (variable length)                     \
-/                                                               /
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-|                            Latency                            |
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-
-struct Relay {
-	string URL<2083>;
-	int Latency;
-}
-
-*/
-
-func (o Relay) EncodeXDR(w io.Writer) (int, error) {
-	var xw = xdr.NewWriter(w)
-	return o.EncodeXDRInto(xw)
-}
-
-func (o Relay) MarshalXDR() ([]byte, error) {
-	return o.AppendXDR(make([]byte, 0, 128))
-}
-
-func (o Relay) MustMarshalXDR() []byte {
-	bs, err := o.MarshalXDR()
-	if err != nil {
-		panic(err)
-	}
-	return bs
-}
-
-func (o Relay) AppendXDR(bs []byte) ([]byte, error) {
-	var aw = xdr.AppendWriter(bs)
-	var xw = xdr.NewWriter(&aw)
-	_, err := o.EncodeXDRInto(xw)
-	return []byte(aw), err
-}
-
-func (o Relay) EncodeXDRInto(xw *xdr.Writer) (int, error) {
-	if l := len(o.URL); l > 2083 {
-		return xw.Tot(), xdr.ElementSizeExceeded("URL", l, 2083)
-	}
-	xw.WriteString(o.URL)
-	xw.WriteUint32(uint32(o.Latency))
-	return xw.Tot(), xw.Error()
-}
-
-func (o *Relay) DecodeXDR(r io.Reader) error {
-	xr := xdr.NewReader(r)
-	return o.DecodeXDRFrom(xr)
-}
-
-func (o *Relay) UnmarshalXDR(bs []byte) error {
-	var br = bytes.NewReader(bs)
-	var xr = xdr.NewReader(br)
-	return o.DecodeXDRFrom(xr)
-}
-
-func (o *Relay) DecodeXDRFrom(xr *xdr.Reader) error {
-	o.URL = xr.ReadStringMax(2083)
-	o.Latency = int32(xr.ReadUint32())
-	return xr.Error()
-}
-
-/*
-
 Device Structure:
 
  0                   1                   2                   3
@@ -200,10 +126,8 @@ Device Structure:
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                      Number of Addresses                      |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-|                      Length of Addresses                      |
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 /                                                               /
-\                  Addresses (variable length)                  \
+\                Zero or more Address Structures                \
 /                                                               /
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                       Number of Relays                        |
@@ -216,7 +140,7 @@ Device Structure:
 
 struct Device {
 	opaque ID<32>;
-	string Addresses<16>;
+	Address Addresses<16>;
 	Relay Relays<16>;
 }
 
@@ -256,7 +180,10 @@ func (o Device) EncodeXDRInto(xw *xdr.Writer) (int, error) {
 	}
 	xw.WriteUint32(uint32(len(o.Addresses)))
 	for i := range o.Addresses {
-		xw.WriteString(o.Addresses[i])
+		_, err := o.Addresses[i].EncodeXDRInto(xw)
+		if err != nil {
+			return xw.Tot(), err
+		}
 	}
 	if l := len(o.Relays); l > 16 {
 		return xw.Tot(), xdr.ElementSizeExceeded("Relays", l, 16)
@@ -291,9 +218,9 @@ func (o *Device) DecodeXDRFrom(xr *xdr.Reader) error {
 	if _AddressesSize > 16 {
 		return xdr.ElementSizeExceeded("Addresses", _AddressesSize, 16)
 	}
-	o.Addresses = make([]string, _AddressesSize)
+	o.Addresses = make([]Address, _AddressesSize)
 	for i := range o.Addresses {
-		o.Addresses[i] = xr.ReadString()
+		(&o.Addresses[i]).DecodeXDRFrom(xr)
 	}
 	_RelaysSize := int(xr.ReadUint32())
 	if _RelaysSize < 0 {
@@ -308,3 +235,146 @@ func (o *Device) DecodeXDRFrom(xr *xdr.Reader) error {
 	}
 	return xr.Error()
 }
+
+/*
+
+Address Structure:
+
+ 0                   1                   2                   3
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+|                         Length of URL                         |
++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/                                                               /
+\                     URL (variable length)                     \
+/                                                               /
++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+
+struct Address {
+	string URL<2083>;
+}
+
+*/
+
+func (o Address) EncodeXDR(w io.Writer) (int, error) {
+	var xw = xdr.NewWriter(w)
+	return o.EncodeXDRInto(xw)
+}
+
+func (o Address) MarshalXDR() ([]byte, error) {
+	return o.AppendXDR(make([]byte, 0, 128))
+}
+
+func (o Address) MustMarshalXDR() []byte {
+	bs, err := o.MarshalXDR()
+	if err != nil {
+		panic(err)
+	}
+	return bs
+}
+
+func (o Address) AppendXDR(bs []byte) ([]byte, error) {
+	var aw = xdr.AppendWriter(bs)
+	var xw = xdr.NewWriter(&aw)
+	_, err := o.EncodeXDRInto(xw)
+	return []byte(aw), err
+}
+
+func (o Address) EncodeXDRInto(xw *xdr.Writer) (int, error) {
+	if l := len(o.URL); l > 2083 {
+		return xw.Tot(), xdr.ElementSizeExceeded("URL", l, 2083)
+	}
+	xw.WriteString(o.URL)
+	return xw.Tot(), xw.Error()
+}
+
+func (o *Address) DecodeXDR(r io.Reader) error {
+	xr := xdr.NewReader(r)
+	return o.DecodeXDRFrom(xr)
+}
+
+func (o *Address) UnmarshalXDR(bs []byte) error {
+	var br = bytes.NewReader(bs)
+	var xr = xdr.NewReader(br)
+	return o.DecodeXDRFrom(xr)
+}
+
+func (o *Address) DecodeXDRFrom(xr *xdr.Reader) error {
+	o.URL = xr.ReadStringMax(2083)
+	return xr.Error()
+}
+
+/*
+
+Relay Structure:
+
+ 0                   1                   2                   3
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+|                         Length of URL                         |
++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/                                                               /
+\                     URL (variable length)                     \
+/                                                               /
++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+|                            Latency                            |
++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+
+
+struct Relay {
+	string URL<2083>;
+	int Latency;
+}
+
+*/
+
+func (o Relay) EncodeXDR(w io.Writer) (int, error) {
+	var xw = xdr.NewWriter(w)
+	return o.EncodeXDRInto(xw)
+}
+
+func (o Relay) MarshalXDR() ([]byte, error) {
+	return o.AppendXDR(make([]byte, 0, 128))
+}
+
+func (o Relay) MustMarshalXDR() []byte {
+	bs, err := o.MarshalXDR()
+	if err != nil {
+		panic(err)
+	}
+	return bs
+}
+
+func (o Relay) AppendXDR(bs []byte) ([]byte, error) {
+	var aw = xdr.AppendWriter(bs)
+	var xw = xdr.NewWriter(&aw)
+	_, err := o.EncodeXDRInto(xw)
+	return []byte(aw), err
+}
+
+func (o Relay) EncodeXDRInto(xw *xdr.Writer) (int, error) {
+	if l := len(o.URL); l > 2083 {
+		return xw.Tot(), xdr.ElementSizeExceeded("URL", l, 2083)
+	}
+	xw.WriteString(o.URL)
+	xw.WriteUint32(uint32(o.Latency))
+	return xw.Tot(), xw.Error()
+}
+
+func (o *Relay) DecodeXDR(r io.Reader) error {
+	xr := xdr.NewReader(r)
+	return o.DecodeXDRFrom(xr)
+}
+
+func (o *Relay) UnmarshalXDR(bs []byte) error {
+	var br = bytes.NewReader(bs)
+	var xr = xdr.NewReader(br)
+	return o.DecodeXDRFrom(xr)
+}
+
+func (o *Relay) DecodeXDRFrom(xr *xdr.Reader) error {
+	o.URL = xr.ReadStringMax(2083)
+	o.Latency = int32(xr.ReadUint32())
+	return xr.Error()
+}