def dataReceived(self, data):
        """
        Parses chunks of bytes into responses.

        Whenever a complete response is received, this method extracts its
        payload and calls L{responseReceived} to process it.

        @param data: A chunk of data representing a (possibly partial) response
        @type data: C{bytes}
        """
        size = len(self._buffer) + len(data)
        if size > self.MAX_LENGTH:
            self.lengthLimitExceeded(size)
        self._buffer += data

        start = 0
        for match in self._pattern.finditer(self._buffer):
            # The start of the sentinel marks the end of the response.
            end = match.start()
            tag = int(match.group(1))
            self.responseReceived(self._buffer[start:end], tag)

            # Advance start position to the beginning of the next line
            start = match.end() + 1

        if start:
            self._buffer = self._buffer[start:]
Parses chunks of bytes into responses.

        Whenever a complete response is received, this method extracts its
        payload and calls L{responseReceived} to process it.

        @param data: A chunk of data representing a (possibly partial) response
        @type data: C{bytes}