def read_response(self): response = yield self._buffer.readline() if not response: raise ConnectionError(SERVER_CLOSED_CONNECTION_ERROR) byte, response = byte_to_chr(response[0]), response[1:] if byte not in ('-', '+', ':', '$', '*'): raise InvalidResponse("Protocol Error: %s, %s" % (str(byte), str(response))) # server returned an error if byte == '-': response = nativestr(response) error = self.parse_error(response) # if the error is a ConnectionError, raise immediately so the user # is notified if isinstance(error, ConnectionError): raise error # otherwise, we're dealing with a ResponseError that might belong # inside a pipeline response. the connection's read_response() # and/or the pipeline's execute() will raise this error if # necessary, so just return the exception instance here. raise gen.Return(error) # single value elif byte == '+': pass # int value elif byte == ':': response = long(response) # bulk response elif byte == '$': length = int(response) if length == -1: raise gen.Return(None) response = yield self._buffer.read(length) # multi-bulk response elif byte == '*': length = int(response) if length == -1: raise gen.Return(None) response = [] for i in xrange(length): res = yield self.read_response() response.append(res) if isinstance(response, bytes) and self.encoding: response = response.decode(self.encoding) raise gen.Return(response)
def read_response(self): response = self.read() if not response: raise ConnectionError("Socket closed on remote end") byte, response = byte_to_chr(response[0]), response[1:] if byte not in ('-', '+', ':', '$', '*'): message = "Protocol Error: %s, %s" % (str(byte), str(response)) raise InvalidResponse("%s" % message) # server returned an error if byte == '-': response = nativestr(response) error = self.parse_error(response) # if the error is a ConnectionError, raise immediately so the user # is notified if isinstance(error, ConnectionError): raise error # otherwise, we're dealing with a ResponseError that might belong # inside a pipeline response. the connection's read_response() # and/or the pipeline's execute() will raise this error if # necessary, so just return the exception instance here. return error # single value elif byte == '+': pass # int value elif byte == ':': response = long(response) # bulk response elif byte == '$': length = int(response) if length == -1: return None response = self.read(length) # multi-bulk response elif byte == '*': length = int(response) if length == -1: return None response = [self.read_response() for i in xrange(length)] if isinstance(response, bytes) and self.encoding: response = response.decode(self.encoding) return response
def read_response(self): response = self._buffer.readline() if not response: raise ConnectionError(SERVER_CLOSED_CONNECTION_ERROR) byte, response = byte_to_chr(response[0]), response[1:] if byte not in ('-', '+', ':', '$', '*'): raise InvalidResponse("Protocol Error: %s, %s" % (str(byte), str(response))) # server returned an error if byte == '-': response = nativestr(response) error = self.parse_error(response) # if the error is a ConnectionError, raise immediately so the user # is notified if isinstance(error, ConnectionError): raise error # otherwise, we're dealing with a ResponseError that might belong # inside a pipeline response. the connection's read_response() # and/or the pipeline's execute() will raise this error if # necessary, so just return the exception instance here. return error # single value elif byte == '+': pass # int value elif byte == ':': response = long(response) # bulk response elif byte == '$': length = int(response) if length == -1: return None response = self._buffer.read(length) # multi-bulk response elif byte == '*': length = int(response) if length == -1: return None response = [self.read_response() for i in xrange(length)] if isinstance(response, bytes) and self.encoding: response = response.decode(self.encoding) return response
def read_response(self): response = self.read() if not response: raise ConnectionError("Socket closed on remote end") byte, response = byte_to_chr(response[0]), response[1:] if byte not in ('-', '+', ':', '$', '*'): raise InvalidResponse("Protocol Error") # server returned an error if byte == '-': if nativestr(response).startswith('LOADING '): # if we're loading the dataset into memory, kill the socket # so we re-initialize (and re-SELECT) next time. raise ConnectionError("Redis is loading data into memory") # if the error starts with ERR, trim that off if nativestr(response).startswith('ERR '): response = response[4:] # *return*, not raise the exception class. if it is meant to be # raised, it will be at a higher level. return ResponseError(response) # single value elif byte == '+': pass # int value elif byte == ':': response = long(response) # bulk response elif byte == '$': length = int(response) if length == -1: return None response = self.read(length) # multi-bulk response elif byte == '*': length = int(response) if length == -1: return None response = [self.read_response() for i in xrange(length)] if isinstance(response, bytes) and self.encoding: response = response.decode(self.encoding) return response
def read_response(self): response = self.read() if not response: raise ConnectionError("Socket closed on remote end") byte, response = byte_to_chr(response[0]), response[1:] if byte not in ("-", "+", ":", "$", "*"): raise InvalidResponse("Protocol Error") # server returned an error if byte == "-": response = nativestr(response) if response.startswith("LOADING "): # if we're loading the dataset into memory, kill the socket # so we re-initialize (and re-SELECT) next time. raise ConnectionError("Redis is loading data into memory") # *return*, not raise the exception class. if it is meant to be # raised, it will be at a higher level. return self.parse_error(response) # single value elif byte == "+": pass # int value elif byte == ":": response = long(response) # bulk response elif byte == "$": length = int(response) if length == -1: return None response = self.read(length) # multi-bulk response elif byte == "*": length = int(response) if length == -1: return None response = [self.read_response() for i in xrange(length)] if isinstance(response, bytes) and self.encoding: response = response.decode(self.encoding) return response
def read_response(self): try: response = yield self._stream.read_until(SYM_CRLF) except StreamClosedError: raise socket.error(SERVER_CLOSED_CONNECTION_ERROR) response = response[:-2] if not response: raise ConnectionError(SERVER_CLOSED_CONNECTION_ERROR) byte, response = byte_to_chr(response[0]), response[1:] if byte not in ('-', '+', ':', '$', '*'): raise InvalidResponse("Protocol Error: %s, %s" % (str(byte), str(response))) if byte == '-': response = nativestr(response) error = self.parse_error(response) if isinstance(error, ConnectionError): raise error raise gen.Return(error) elif byte == '+': pass elif byte == ':': response = long(response) elif byte == '$': length = int(response) if length == -1: raise gen.Return(None) response = yield self._stream.read_bytes( length + 2) # make sure to read the '\r\n' response = response[:-2] elif byte == '*': length = int(response) if length == -1: raise gen.Return(None) response = [] for i in xrange(length): part = yield self.read_response() response.append(part) if isinstance(response, bytes): response = self.encoder.decode(response) raise gen.Return(response)
def read_response(self): response = self.read() if not response: raise ConnectionError("Socket closed on remote end") byte, response = byte_to_chr(response[0]), response[1:] if byte not in ('-', '+', ':', '$', '*'): raise InvalidResponse("Protocol Error") # server returned an error if byte == '-': response = nativestr(response) # *return*, not raise the exception class. if it is meant to be # raised, it will be at a higher level. return self.parse_error(response) # single value elif byte == '+': pass # int value elif byte == ':': response = long(response) # bulk response elif byte == '$': length = int(response) if length == -1: return None response = self.read(length) # multi-bulk response elif byte == '*': length = int(response) if length == -1: return None response = [self.read_response() for i in xrange(length)] if isinstance(response, bytes) and self.encoding: response = response.decode(self.encoding) return response
def read_response(self): ''' Reads one line from the wire, and interprets it. Example: the acknowledgment to an unsubscribe from topic myTopic on the wire looks like this: *3\r\n$11\r\nUNSUBSCRIBE\r\n$7\r\nmyTopic\r\n:1\r\n' *3 # three items to follow $11 # string of 11 chars UNSUBSCRIBE $7 # string of 7 chars myTopic :1 # one topic subscribed to now Each line will cause a recursive call to this method (see elif byte == '*' below). Simpler calls will be individual elements, such as ':12', which returns the integer 12. These are the possible prefixes; each item is followed by a \r\n, which is stripped by SocketLineReader: +<str> simple string :<int> integer $<n> string of length <n> *<num> start of array with <num> elements When the message to parse is the acknowledgment of a SUBSCRIBE or UNSUBSCRIBE command, this method will set() event self.unsubscribeAckEvent/self.unsubscribeAckEvent. :return: response string :rtype: string ''' response = self._buffer.readline() if not response: raise ConnectionError(SERVER_CLOSED_CONNECTION_ERROR) byte, response = byte_to_chr(response[0]), response[1:] if byte not in ('-', '+', ':', '$', '*'): raise InvalidResponse("Protocol Error: %s, %s" % (str(byte), str(response))) # server returned an error if byte == '-': response = nativestr(response) error = self.parse_error(response) # if the error is a ConnectionError, raise immediately so the user # is notified if isinstance(error, ConnectionError): raise error # otherwise, we're dealing with a ResponseError that might belong # inside a pipeline response. the connection's read_response() # and/or the pipeline's execute() will raise this error if # necessary, so just return the exception instance here. return error # simple-string: response holds result: elif byte == '+': pass # int value elif byte == ':': response = long(response) # bulk response elif byte == '$': length = int(response) if length == -1: # Null string: return None response = self._buffer.read(length) # multi-bulk response elif byte == '*': length = int(response) if length == -1: return None response = [self.read_response() for _ in xrange(length)] if isinstance(response, bytes) and self.encoding: response = response.decode(self.encoding) #*********** #print('Response: %s' % byte + '|' + str(response)) #*********** return response