docs: def process_data(self):
          "read and process input from self.socket"
  
          try:
              reader = getattr(self.socket, 'read', self.socket.recv)
              new_data = reader(2 ** 14)
          except socket.error:
              # The server hung up.
              self.disconnect("Connection reset by peer")
              return
          if not new_data:
              # Read nothing: connection must be down.
              self.disconnect("Connection reset by peer")
              return
  
          self.buffer.feed(new_data)
  
          # process each non-empty line after logging all lines
          for line in self.buffer:
              log.debug("FROM SERVER: %s", line)
              if not line:
                  continue
              self._process_line(line)