def _read(self, limit=4096): # See if there's data available to read. try: r, w, x, = select([self.socket], [], [], TIMEOUT) except (TypeError, socket.error): self._disconnected() if self.socket in r: # Receive any available data, update Reader's buffer try: buf = self.socket.recv(limit) except socket.error: buf = None # Check for end of stream if not buf: self._disconnected() if self.debug: self.debug_out(utils.dump_bytes(buf, prefix=" << ") + "\n") self.reader.data(buf) # Process received nodes nodes = [] while True: try: node, plain = self.reader.read() if self.debug: self.debug_out( utils.dump_bytes(plain, prefix="pln << ") + "\n") if self.debug: self.debug_out( utils.dump_xml(node, prefix="xml << ") + "\n") nodes.append(node) except MessageIncomplete: break except EndOfStream: self._disconnected() break # Return complete nodes return nodes
def _write(self, buf, encrypt=None): if isinstance(buf, Node): if self.debug: self.debug_out(utils.dump_xml(buf, prefix="xml >> ") + "\n") buf, plain = self.writer.node(buf, encrypt) else: plain = buf if self.debug: self.debug_out(utils.dump_bytes(plain, prefix="pln >> ") + "\n") if self.debug: self.debug_out(utils.dump_bytes(buf, prefix=" >> ") + "\n") try: self.socket.sendall(buf) except socket.error: self._disconnected()