docs: def plaintext_request(self, registration_id, data=None, collapse_key=None,
                            delay_while_idle=False, time_to_live=None, retries=5, dry_run=False):
          """
          Makes a plaintext request to GCM servers
  
          :param registration_id: string of the registration id
          :param data: dict mapping of key-value pairs of messages
          :return dict of response body from Google including multicast_id, success, failure, canonical_ids, etc
          :raises GCMMissingRegistrationException: if registration_id is not provided
          """
  
          if not registration_id:
              raise GCMMissingRegistrationException("Missing registration_id")
  
          payload = self.construct_payload(
              registration_id, data, collapse_key,
              delay_while_idle, time_to_live, False, dry_run
          )
  
          attempt = 0
          backoff = self.BACKOFF_INITIAL_DELAY
          for attempt in range(retries):
              try:
                  response = self.make_request(payload, is_json=False)
                  return self.handle_plaintext_response(response)
              except GCMUnavailableException:
                  sleep_time = backoff / 2 + random.randrange(backoff)
                  time.sleep(float(sleep_time) / 1000)
                  if 2 * backoff < self.MAX_BACKOFF_DELAY:
                      backoff *= 2
  
          raise IOError("Could not make request after %d attempts" % attempt)