class_docstr: Salesforce StreamAlert Base App
  
  SalesforceApp will audit 5 types of event logs include 'Console', 'Login',
  'LoginAs', 'Report' and 'ReportExport' for user access audit and data loss
  prevention, although Salesforce provides 42 types of event logs.
  
  This base class will be inherited by different subclasssed based on different
  event types.
  
  Console events:
      contain information about the performance and use of Salesforce Consoles.
  
  Login events:
      contain details about your org's user login history.
  
  LoginAs events:
      contain details about what a Salesforce admin did while logged in as another user.
  
  Report events:
      contain information about what happened when a user ran a report and
      captures report's size.
  
  ReportExport:
      events contain details about reports that a user exported.
docstr: Make GET request with backoff logic
  
  This method overrides the method in AppIntegration base class to handle
  not only JSON response, but also raw text response which is returned when
  send GET request to fetch event logs. Also, this class will trigger backoff
  when SalesforceAppError exception raised.
  
  Args:
      full_url (str): The full url of GET request.
      headers (dict): A dictionary includes bearer token.
  
  Returns:
      bool: True if GET response is valid.
      dict/string/None: If GET request to fetch log files and support API
          version list, it will return a dict. If it requests to fetch event
          logs, it will return raw text which can be decoded by CSV DictReader
          later. Otherwise it will return None.
code: def _make_get_request(self, full_url, headers, params=None):
      """Make GET request with backoff logic
  
      This method overrides the method in AppIntegration base class to handle
      not only JSON response, but also raw text response which is returned when
      send GET request to fetch event logs. Also, this class will trigger backoff
      when SalesforceAppError exception raised.
  
      Args:
          full_url (str): The full url of GET request.
          headers (dict): A dictionary includes bearer token.
  
      Returns:
          bool: True if GET response is valid.
          dict/string/None: If GET request to fetch log files and support API
              version list, it will return a dict. If it requests to fetch event
              logs, it will return raw text which can be decoded by CSV DictReader
              later. Otherwise it will return None.
      """
  
      @backoff.on_exception(
          backoff.expo,
          self.EXCEPTIONS_TO_BACKOFF,
          max_tries=self.BACKOFF_MAX_RETRIES,
      )
      def _make_get_request():
          # To use closure here is to make backoff logic patchable and testable.
          try:
              # Log GET request URL for debugging purpose, especially useful when
              # debugging query syntax
              LOGGER.debug("URL of GET request is %s", full_url)
              resp = requests.get(
                  full_url,
                  headers=headers,
                  params=params,
                  timeout=self._TIMEOUT,
              )
  
              # Return false if resp contains non-200 status code.
              if not self._validate_status_code(resp):
                  return False, None
  
              # When querying list of api versions and log files, Salesforce responses
              # json content.
              return True, resp.json()
          except requests.exceptions.Timeout:
              LOGGER.exception(
                  "Request timed out for when sending get request to %s",
                  full_url,
              )
              return False, None
          except ValueError:
              # When fetch log events, Salesforce returns raw data in csv format, not json
              return True, resp.text
  
      return _make_get_request()
  
imports: import calendar
  from datetime import datetime
  import re
  import time
  import backoff
  import requests
  from .None import AppIntegration, StreamAlertApp, get_logger
label_desc: Use image node_id 9 for calling the SalesforceApp obj's underlying member method code with example usage: obj._make_get_request(full_url, headers, params) and returns: _make_get_request, True,  resp, False,  None, False,  None, True,  resp