async def _sasl_respond(self):
        """ Respond to SASL challenge with response. """
        # Formulate a response.
        if self._sasl_client:
            try:
                response = self._sasl_client.process(self._sasl_challenge)
            except puresasl.SASLError:
                response = None

            if response is None:
                self.logger.warning('SASL challenge processing failed: aborting SASL authentication.')
                await self._sasl_abort()
        else:
            response = b''

        response = base64.b64encode(response).decode(self.encoding)
        to_send = len(response)
        self._sasl_challenge = b''

        # Send response in chunks.
        while to_send > 0:
            await self.rawmsg('AUTHENTICATE', response[:RESPONSE_LIMIT])
            response = response[RESPONSE_LIMIT:]
            to_send -= RESPONSE_LIMIT

        # If our message fit exactly in SASL_RESPOSE_LIMIT-byte chunks, send an empty message to indicate we're done.
        if to_send == 0:
            await self.rawmsg('AUTHENTICATE', EMPTY_MESSAGE)
Respond to SASL challenge with response.