code: func (cs *ClientServerImpl) SetReadDeadline(t time.Time) error {
  	err := cs.conn.SetReadDeadline(t)
  	if err == nil {
  		return nil
  	}
  	seelog.Warnf("Unable to set read deadline for websocket connection: %v for %s", err, cs.URL)
  	// If we get connection closed error from SetReadDeadline, break out of the for loop and
  	// return an error
  	if opErr, ok := err.(*net.OpError); ok && strings.Contains(opErr.Err.Error(), errClosed) {
  		seelog.Errorf("Stopping redundant reads on closed network connection: %s", cs.URL)
  		return opErr
  	}
  	// An unhandled error has occurred while trying to extend read deadline.
  	// Try asynchronously closing the connection. We don't want to be blocked on stale connections
  	// taking too long to close. The flip side is that we might start accumulating stale connections.
  	// But, that still seems more desirable than waiting for ever for the connection to close
  	cs.forceCloseConnection()
  	return err
  }
docs: // SetReadDeadline sets the read deadline for the websocket connection
  // A read timeout results in an io error if there are any outstanding reads
  // that exceed the deadline