def read_short_string(data, cur): if len(data) < cur + 2: raise BufferUnderflowError("Not enough data left") (strlen, ) = struct.unpack('>h', data[cur:cur + 2]) if strlen == -1: return None, cur + 2 cur += 2 if len(data) < cur + strlen: raise BufferUnderflowError("Not enough data left") out = data[cur:cur + strlen] return out, cur + strlen
def relative_unpack(fmt, data, cur): size = struct.calcsize(fmt) if len(data) < cur + size: raise BufferUnderflowError("Not enough data left") out = struct.unpack(fmt, data[cur:cur + size]) return out, cur + size
def read_int_string(data, cur): if len(data) < cur + 4: raise BufferUnderflowError( "Not enough data left to read string len (%d < %d)" % (len(data), cur + 4)) (strlen, ) = struct.unpack('>i', data[cur:cur + 4]) if strlen == -1: return None, cur + 4 cur += 4 if len(data) < cur + strlen: raise BufferUnderflowError("Not enough data left") out = data[cur:cur + strlen] return out, cur + strlen
def _consume_response_iter(self): """ This method handles the response header and error messages. It then returns an iterator for the chunks of the response """ log.debug("Handling response from Kafka") # Read the size off of the header resp = self._sock.recv(4) if resp == "": self._raise_connection_error() (size, ) = struct.unpack('>i', resp) messagesize = size - 4 log.debug("About to read %d bytes from Kafka", messagesize) # Read the remainder of the response total = 0 while total < messagesize: resp = self._sock.recv(self.bufsize) log.debug("Read %d bytes from Kafka", len(resp)) if resp == "": raise BufferUnderflowError( "Not enough data to read this response") total += len(resp) yield resp