'Makes a plaintext request to GCM servers
:return dict of response body from Google including multicast_id, success, failure, canonical_ids, etc'

def plaintext_request(self, **kwargs):

    if ('registration_id' not in kwargs):
        raise GCMMissingRegistrationException('Missing    registration_id')
    elif (not kwargs['registration_id']):
        raise GCMMissingRegistrationException('Empty    registration_id')
    kwargs['is_json'] = False
    retries = kwargs.pop('retries', 5)
    session = kwargs.pop('session', None)
    payload = self.construct_payload(**kwargs)
    backoff = self.BACKOFF_INITIAL_DELAY
    info = None
    has_error = False
    for attempt in range(retries):
        try:
            response = self.make_request(payload, is_json=False, session=session)
            info = self.handle_plaintext_response(response)
            has_error = False
        except GCMUnavailableException:
            has_error = True
        if self.retry_after:
            GCM.log('[plaintext_request    -    Attempt    #{0}]    Retry-After    ~>    Sleeping    for    {1}    seconds'.format(attempt, self.retry_after))
            time.sleep(self.retry_after)
            self.retry_after = None
        elif has_error:
            sleep_time = ((backoff / 2) + random.randrange(backoff))
            nap_time = (float(sleep_time) / 1000)
            GCM.log('[plaintext_request    -    Attempt    #{0}]Backoff    ~>    Sleeping    for    {1}    seconds'.format(attempt, nap_time))
            time.sleep(nap_time)
            if ((2 * backoff) < self.MAX_BACKOFF_DELAY):
                backoff *= 2
        else:
            break
    if has_error:
        raise IOError(('Could    not    make    request    after    %d    attempts' % retries))
    return info
