def handle(self): logger.info('Client connected: %s' % self.client_ident()) while True: buf = '' ready_to_read, ready_to_write, in_error = select.select([self.request], [], [], 0.1) # Write any commands to the client while self.send_queue: msg = self.send_queue.popleft() logger.debug('to %s: %s' % (self.client_ident(), msg)) try: self.request.send(msg + '\r\n') except socket.error: # Client is disconnected automatically pass # See if the client has any commands for us. if len(ready_to_read) == 1 and ready_to_read[0] == self.request: data = self.request.recv(1024) if not data: break elif len(data) > 0: # There is data. Process it and turn it into line-oriented input. buf += str(data) while '\n' in buf: line, buf = buf.split("\n", 1) line = line.rstrip() response = '' try: logger.debug('from %s: %s' % (self.client_ident(), line)) prefix, command, params = irc_split(line) handler = getattr(self, 'handle_%s' % (command.lower()), None) if not handler: logger.info('No handler for command: %s. Full line: %s' % (command, line)) raise IRCError(rpl.ERR_UNKNOWNCOMMAND, '%s :Unknown command' % (command)) response = handler(params) except AttributeError, e: raise e logger.error('%s', e) except IRCError, e: response = ':%s %s %s' % (self.server.servername, e.code, e.value) logger.error('%s', response) except Exception, e: response = ':%s ERROR %s' % (self.server.servername, repr(e)) logger.error('%s', response) raise else: if response: self.send_queue.append(response)
def test_split_unsplit(msg, msgsplit): msg = irc_unsplit(*msgsplit) assert irc_split(msg) == msgsplit, \ "%s -> %s -> %s" % (msg, msgsplit, irc_split(msg))
def test_irc_split(msg, msgsplit): assert msgsplit == irc_split(msg)