From 9047d56aa06245cc4201cc0640e8c8a5ec773212 Mon Sep 17 00:00:00 2001 From: Audrius Butkevicius Date: Fri, 20 Nov 2015 23:42:49 +0000 Subject: [PATCH] Add RelayFull message --- lib/relay/client/static.go | 7 ++++ lib/relay/protocol/packets.go | 2 ++ lib/relay/protocol/packets_xdr.go | 57 +++++++++++++++++++++++++++++++ lib/relay/protocol/protocol.go | 7 ++++ 4 files changed, 73 insertions(+) diff --git a/lib/relay/client/static.go b/lib/relay/client/static.go index 5cce7b25..19624e47 100644 --- a/lib/relay/client/static.go +++ b/lib/relay/client/static.go @@ -119,6 +119,10 @@ func (c *staticClient) Serve() { } c.invitations <- msg + case protocol.RelayFull: + l.Infoln("Disconnected from relay due to it becoming full.") + return + default: l.Infoln("Relay: protocol error: unexpected message %v", msg) return @@ -240,6 +244,9 @@ func (c *staticClient) join() error { return fmt.Errorf("Incorrect response code %d: %s", msg.Code, msg.Message) } + case protocol.RelayFull: + return fmt.Errorf("relay full") + default: return fmt.Errorf("protocol error: expecting response got %v", msg) } diff --git a/lib/relay/protocol/packets.go b/lib/relay/protocol/packets.go index cd6ff620..fca3598a 100644 --- a/lib/relay/protocol/packets.go +++ b/lib/relay/protocol/packets.go @@ -20,6 +20,7 @@ const ( messageTypeResponse messageTypeConnectRequest messageTypeSessionInvitation + messageTypeRelayFull ) type header struct { @@ -31,6 +32,7 @@ type header struct { type Ping struct{} type Pong struct{} type JoinRelayRequest struct{} +type RelayFull struct{} type JoinSessionRequest struct { Key []byte // max:32 diff --git a/lib/relay/protocol/packets_xdr.go b/lib/relay/protocol/packets_xdr.go index f18e18c1..51149da2 100644 --- a/lib/relay/protocol/packets_xdr.go +++ b/lib/relay/protocol/packets_xdr.go @@ -256,6 +256,63 @@ func (o *JoinRelayRequest) DecodeXDRFrom(xr *xdr.Reader) error { /* +RelayFull 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 ++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + +struct RelayFull { +} + +*/ + +func (o RelayFull) EncodeXDR(w io.Writer) (int, error) { + var xw = xdr.NewWriter(w) + return o.EncodeXDRInto(xw) +} + +func (o RelayFull) MarshalXDR() ([]byte, error) { + return o.AppendXDR(make([]byte, 0, 128)) +} + +func (o RelayFull) MustMarshalXDR() []byte { + bs, err := o.MarshalXDR() + if err != nil { + panic(err) + } + return bs +} + +func (o RelayFull) 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 RelayFull) EncodeXDRInto(xw *xdr.Writer) (int, error) { + return xw.Tot(), xw.Error() +} + +func (o *RelayFull) DecodeXDR(r io.Reader) error { + xr := xdr.NewReader(r) + return o.DecodeXDRFrom(xr) +} + +func (o *RelayFull) UnmarshalXDR(bs []byte) error { + var br = bytes.NewReader(bs) + var xr = xdr.NewReader(br) + return o.DecodeXDRFrom(xr) +} + +func (o *RelayFull) DecodeXDRFrom(xr *xdr.Reader) error { + return xr.Error() +} + +/* + JoinSessionRequest Structure: 0 1 2 3 diff --git a/lib/relay/protocol/protocol.go b/lib/relay/protocol/protocol.go index 57a967ac..dad76d94 100644 --- a/lib/relay/protocol/protocol.go +++ b/lib/relay/protocol/protocol.go @@ -50,6 +50,9 @@ func WriteMessage(w io.Writer, message interface{}) error { case SessionInvitation: payload, err = msg.MarshalXDR() header.messageType = messageTypeSessionInvitation + case RelayFull: + payload, err = msg.MarshalXDR() + header.messageType = messageTypeRelayFull default: err = fmt.Errorf("Unknown message type") } @@ -108,6 +111,10 @@ func ReadMessage(r io.Reader) (interface{}, error) { var msg SessionInvitation err := msg.DecodeXDR(r) return msg, err + case messageTypeRelayFull: + var msg RelayFull + err := msg.DecodeXDR(r) + return msg, err } return nil, fmt.Errorf("Unknown message type")