def __read(self): """ Read the next frame(s) from the socket. """ fastbuf = StringIO() while self.__running: try: c = self.__socket.recv(1024) c = decode(c) # reset the heartbeat for any received message self.__received_heartbeat = time.time() except Exception: _, e, _ = sys.exc_info() c = '' if len(c) == 0: raise exception.ConnectionClosedException() fastbuf.write(c) if '\x00' in c: break elif c == '\x0a': # heartbeat (special case) return c self.__recvbuf += fastbuf.getvalue() fastbuf.close() result = [] if len(self.__recvbuf) > 0 and self.__running: while True: pos = self.__recvbuf.find('\x00') if pos >= 0: frame = self.__recvbuf[0:pos] preamble_end = frame.find('\n\n') if preamble_end >= 0: content_length_match = Connection.__content_length_re.search( frame[0:preamble_end]) if content_length_match: content_length = int( content_length_match.group('value')) content_offset = preamble_end + 2 frame_size = content_offset + content_length if frame_size > len(frame): # # Frame contains NUL bytes, need to read more # if frame_size < len(self.__recvbuf): pos = frame_size frame = self.__recvbuf[0:pos] else: # # Haven't read enough data yet, exit loop and wait for more to arrive # break result.append(frame) self.__recvbuf = self.__recvbuf[pos + 1:] else: break return result
def __read(self): """ Read the next frame(s) from the socket. """ fastbuf = StringIO() while self.__running: try: c = self.__socket.recv(1024) c = decode(c) # reset the heartbeat for any received message self.__received_heartbeat = time.time() except Exception: _, e, _ = sys.exc_info() c = '' if len(c) == 0: raise exception.ConnectionClosedException() fastbuf.write(c) if '\x00' in c: break elif c == '\x0a': # heartbeat (special case) return c self.__recvbuf += fastbuf.getvalue() fastbuf.close() result = [] if len(self.__recvbuf) > 0 and self.__running: while True: pos = self.__recvbuf.find('\x00') if pos >= 0: frame = self.__recvbuf[0:pos] preamble_end = frame.find('\n\n') if preamble_end >= 0: content_length_match = Connection.__content_length_re.search(frame[0:preamble_end]) if content_length_match: content_length = int(content_length_match.group('value')) content_offset = preamble_end + 2 frame_size = content_offset + content_length if frame_size > len(frame): # # Frame contains NUL bytes, need to read more # if frame_size < len(self.__recvbuf): pos = frame_size frame = self.__recvbuf[0:pos] else: # # Haven't read enough data yet, exit loop and wait for more to arrive # break result.append(frame) self.__recvbuf = self.__recvbuf[pos+1:] else: break return result
def __read(self): """ Read the next frame(s) from the socket. """ fastbuf = StringIO() while self.running: try: try: c = self.read_from_socket() except socket.error: _, e, _ = sys.exc_info() if get_errno(e) in (errno.EAGAIN, errno.EINTR): log.debug("socket read interrupted, restarting") continue raise c = decode(c) except Exception: _, e, _ = sys.exc_info() c = '' if len(c) == 0: raise exception.ConnectionClosedException() fastbuf.write(c) if '\x00' in c: break elif c == '\x0a': # heartbeat (special case) return c self.__recvbuf += fastbuf.getvalue() fastbuf.close() result = [] if len(self.__recvbuf) > 0 and self.running: while True: pos = self.__recvbuf.find('\x00') if pos >= 0: frame = self.__recvbuf[0:pos] preamble_end = frame.find('\n\n') if preamble_end >= 0: content_length_match = Transport.__content_length_re.search( frame[0:preamble_end]) if content_length_match: content_length = int( content_length_match.group('value')) content_offset = preamble_end + 2 frame_size = content_offset + content_length if frame_size > len(frame): # # Frame contains NUL bytes, need to read more # if frame_size < len(self.__recvbuf): pos = frame_size frame = self.__recvbuf[0:pos] else: # # Haven't read enough data yet, exit loop and wait for more to arrive # break result.append(frame) self.__recvbuf = self.__recvbuf[pos + 1:] else: break return result
def __read(self): """ Read the next frame(s) from the socket. """ fastbuf = StringIO() while self.running: try: try: c = self.read_from_socket() except socket.error: _, e, _ = sys.exc_info() if get_errno(e) in (errno.EAGAIN, errno.EINTR): log.debug("socket read interrupted, restarting") continue raise c = decode(c) except Exception: _, e, _ = sys.exc_info() c = '' if len(c) == 0: raise exception.ConnectionClosedException() fastbuf.write(c) if '\x00' in c: break elif c == '\x0a': # heartbeat (special case) return c self.__recvbuf += fastbuf.getvalue() fastbuf.close() result = [] if len(self.__recvbuf) > 0 and self.running: while True: pos = self.__recvbuf.find('\x00') if pos >= 0: frame = self.__recvbuf[0:pos] preamble_end = frame.find('\n\n') if preamble_end >= 0: content_length_match = Transport.__content_length_re.search(frame[0:preamble_end]) if content_length_match: content_length = int(content_length_match.group('value')) content_offset = preamble_end + 2 frame_size = content_offset + content_length if frame_size > len(frame): # # Frame contains NUL bytes, need to read more # if frame_size < len(self.__recvbuf): pos = frame_size frame = self.__recvbuf[0:pos] else: # # Haven't read enough data yet, exit loop and wait for more to arrive # break result.append(frame) self.__recvbuf = self.__recvbuf[pos+1:] else: break return result