diff --git a/derp/derp_client.go b/derp/derp_client.go index 11979d93f..58205a361 100644 --- a/derp/derp_client.go +++ b/derp/derp_client.go @@ -351,6 +351,13 @@ func (ServerInfoMessage) msg() {} func (PingMessage) msg() {} +// KeepAliveMessage is a one-way empty message from server to client, just to +// keep the connection alive. It's like a PingMessage, but doesn't solicit +// a reply from the client. +type KeepAliveMessage struct{} + +func (KeepAliveMessage) msg() {} + // Recv reads a message from the DERP server. // // The returned message may alias memory owned by the Client; it @@ -431,7 +438,7 @@ func (c *Client) recvTimeout(timeout time.Duration) (m ReceivedMessage, err erro case frameKeepAlive: // A one-way keep-alive message that doesn't require an acknowledgement. // This predated framePing/framePong. - continue + return KeepAliveMessage{}, nil case framePeerGone: if n < keyLen { c.logf("[unexpected] dropping short peerGone frame from DERP server")