docs: protected void sendAndReceive(HttpMessage message, boolean isFollowRedirect, boolean handleAntiCSRF) throws IOException {
  
          if (parent.handleAntiCsrfTokens() && handleAntiCSRF) {
              if (extAntiCSRF == null) {
                  extAntiCSRF = Control.getSingleton().getExtensionLoader().getExtension(ExtensionAntiCSRF.class);
              }
              if (extAntiCSRF != null) {
                  List<AntiCsrfToken> tokens = extAntiCSRF.getTokens(message);
                  AntiCsrfToken antiCsrfToken = null;
                  if (tokens.size() > 0) {
                      antiCsrfToken = tokens.get(0);
                  }
  
                  if (antiCsrfToken != null) {
                      regenerateAntiCsrfToken(message, antiCsrfToken);
                  }
              }
          }
  
          if (this.parent.getScannerParam().isInjectPluginIdInHeader()) {
      		this.msg.getRequestHeader().setHeader(HttpHeader.X_ZAP_SCAN_ID, Integer.toString(getId()));
      	}
  
          // always get the fresh copy
          message.getRequestHeader().setHeader(HttpHeader.IF_MODIFIED_SINCE, null);
          message.getRequestHeader().setHeader(HttpHeader.IF_NONE_MATCH, null);
          message.getRequestHeader().setContentLength(message.getRequestBody().length());
  
          if (this.getDelayInMs() > 0) {
              try {
                  Thread.sleep(this.getDelayInMs());
              } catch (InterruptedException e) {
                  // Ignore
              }
          }
          
          //ZAP: Runs the "beforeScan" methods of any ScannerHooks
          parent.performScannerHookBeforeScan(message, this);
  
          if (isFollowRedirect) {
              parent.getHttpSender().sendAndReceive(message, getParent().getRedirectRequestConfig());
          } else {
              parent.getHttpSender().sendAndReceive(message, false);
          }
          
          // ZAP: Notify parent
          parent.notifyNewMessage(this, message);
          
          //ZAP: Set the history reference back and run the "afterScan" methods of any ScannerHooks
          parent.performScannerHookAfterScan(message, this);
      }