docs: private boolean scanMessage(Plugin plugin, int messageId) {
          Plugin test;
          HistoryReference historyReference;
          HttpMessage msg;
  
          try {
              historyReference = new HistoryReference(messageId, true);
              msg = historyReference.getHttpMessage();
          } catch (HttpMalformedHeaderException | DatabaseException e) {
              log.warn("Failed to read message with ID [" + messageId + "], cause: " + e.getMessage());
              return false;
          }
  
          try {
              // Ensure the temporary nodes, added automatically to Sites tree, have a response.
              // The scanners might base the logic/attacks on the state of the response (e.g. status code).
              if (msg.getResponseHeader().isEmpty()) {
                  msg = msg.cloneRequest();
                  if (!obtainResponse(historyReference, msg)) {
                      return false;
                  }
              }
  
              if (log.isDebugEnabled()) {
                  log.debug("scanSingleNode node plugin=" + plugin.getName() + " node=" + historyReference.getURI().toString());
              }
  
              test = plugin.getClass().getDeclaredConstructor().newInstance();
              test.setConfig(plugin.getConfig());
              if (this.ruleConfigParam != null) {
  	            // Set the configuration rules
  	            for (RuleConfig rc : this.ruleConfigParam.getAllRuleConfigs()) {
  	                test.getConfig().setProperty(rc.getKey(), rc.getValue());
  	            }
              }
              test.setDelayInMs(plugin.getDelayInMs());
              test.setDefaultAlertThreshold(plugin.getAlertThreshold());
              test.setDefaultAttackStrength(plugin.getAttackStrength());
              test.setTechSet(getTechSet());
              test.init(msg, this);
              notifyHostProgress(plugin.getName() + ": " + msg.getRequestHeader().getURI().toString());
  
          } catch (Exception e) {
              log.error(e.getMessage() + " " + historyReference.getURI().toString(), e);
              return false;
          }
  
          Thread thread;
          do {
  			if (this.isStop()) {
  				return false;
  			}
              thread = threadPool.getFreeThreadAndRun(test);
              if (thread == null) {
                  Util.sleep(200);
              }
              
          } while (thread == null);
  
          mapPluginStats.get(plugin.getId()).incProgress();
          return true;
      }