derp: use a write timeout when sending to clients
@@ -38,6 +38,10 @@ type Server struct {
// second to cap per-client reads at.
BytesPerSecond int
+ // WriteTimeout, if non-zero, specifies how long to wait
+ // before failing when writing to a client.
+ WriteTimeout time.Duration
+
privateKey key.Private
publicKey key.Public
logf logger.Logf
@@ -306,6 +310,9 @@ func (c *sclient) handleFrameSendPacket(ctx context.Context, ft frameType, fl ui
}
dst.mu.Lock()
+ if s.WriteTimeout != 0 {
+ dst.nc.SetWriteDeadline(time.Now().Add(s.WriteTimeout))
+ }
err = s.sendPacket(dst.bw, &dst.info, c.key, contents)
dst.mu.Unlock()
@@ -527,6 +534,9 @@ func (c *sclient) keepAliveLoop(ctx context.Context) error {
c.keepAliveTimer.Reset(keepAlive + jitter)
case <-c.keepAliveTimer.C:
c.mu.Lock()
+ if c.s.WriteTimeout != 0 {
+ c.nc.SetWriteDeadline(time.Now().Add(c.s.WriteTimeout))
+ }
err := writeFrame(c.bw, frameKeepAlive, nil)
if err == nil {
err = c.bw.Flush()
