def integerReceived(self, data): """Integer response received.""" try: reply = int(data) except ValueError: reply = exceptions.InvalidResponse( "Cannot convert data '%s' to integer" % data) if self._multi_bulk_stack: self.handleMultiBulkElement(reply) return self.responseReceived(reply)
def dataReceived(self, data): """Receive data. Spec: http://redis.io/topics/protocol """ self.resetTimeout() self._buffer = self._buffer + data while self._buffer: # if we're expecting bulk data, read that many bytes if self._bulk_length is not None: # wait until there's enough data in the buffer # we add 2 to _bulk_length to account for \r\n if len(self._buffer) < self._bulk_length + 2: return data = self._buffer[:self._bulk_length] self._buffer = self._buffer[self._bulk_length + 2:] self.bulkDataReceived(data) continue # wait until we have a line if '\r\n' not in self._buffer: return # grab a line line, self._buffer = self._buffer.split('\r\n', 1) if len(line) == 0: continue # first byte indicates reply type reply_type = line[0] reply_data = line[1:] # Error message (-) if reply_type == self.ERROR: self.errorReceived(reply_data) # Integer number (:) elif reply_type == self.INTEGER: self.integerReceived(reply_data) # Single line (+) elif reply_type == self.SINGLE_LINE: self.singleLineReceived(reply_data) # Bulk data (&) elif reply_type == self.BULK: try: self._bulk_length = int(reply_data) except ValueError: r = exceptions.InvalidResponse( "Cannot convert data '%s' to integer" % reply_data) self.responseReceived(r) return # requested value may not exist if self._bulk_length == -1: self.bulkDataReceived(None) # Multi-bulk data (*) elif reply_type == self.MULTI_BULK: # reply_data will contain the # of bulks we're about to get try: multi_bulk_length = int(reply_data) except ValueError: r = exceptions.InvalidResponse( "Cannot convert data '%s' to integer" % reply_data) self.responseReceived(r) return if multi_bulk_length == -1: self._multi_bulk_stack.append([-1, None]) self.multiBulkDataReceived() return else: self._multi_bulk_stack.append([multi_bulk_length, []]) if multi_bulk_length == 0: self.multiBulkDataReceived()