Пример #1
0
 def parseAPI(self, handler, apitype, path):
     """ parse request/response into a WebEvent. """
     #logging.warn(dir(handler))
     #logging.warn(dir(handler.request))
     #logging.warn(request.arguments)
     #logging.warn(request.body)
     self.handler = handler
     self.request = handler.request
     self.query = self.request.query
     self.upath = path
     self.apitype = apitype
     self.userhost = tornado.escape.xhtml_escape(handler.current_user)
     if not self.userhost: raise Exception("no current user.")
     input = path
     self.isweb = True
     logging.warn("input is %s" % input)
     if not input: raise NoInput(input)
     self.txt = fromenc(input.strip(), self.bot.encoding)
     self.nick = self.userhost.split("@")[0]
     self.auth = fromenc(self.userhost)
     self.stripped = stripped(self.auth)
     self.channel = stripped(self.userhost)
     self.createdfrom = str(handler)
     logging.debug('tornado - parsed - %s - %s' % (self.txt, self.userhost)) 
     self.prepare()
     return self
Пример #2
0
 def parse(self, handler, request, path=None):
     """ parse request/response into a WebEvent. """
     self.handler = handler
     self.request = request
     self.userhost = tornado.escape.xhtml_escape(handler.current_user)
     if not self.userhost: raise Exception("no current user.")
     try: how = request.arguments['how'][0]
     except KeyError: how = "background"
     if not how: how = "background"
     self.how = how
     if self.how == "undefined": self.how = "overwrite"
     logging.warn("web - how is %s" % self.how)
     input = request.headers.get('content') or request.headers.get('cmnd')
     if not input:
         try: input = request.arguments['content'] or request.arguments['cmnd']
         except KeyError: pass
     self.isweb = True
     if not input: logging.warn("input is %s" % input) ; raise NoInput(input)
     self.txt = fromenc(input[0].strip(), self.bot.encoding)
     self.nick = self.userhost.split("@")[0]
     self.auth = fromenc(self.userhost)
     self.stripped = stripped(self.auth)
     self.channel = stripped(self.userhost)
     self.createdfrom = str(handler)
     logging.debug('tornado - parsed - %s - %s' % (self.txt, self.userhost)) 
     self.prepare()
     return self
Пример #3
0
 def doevent(self, event=None):
     """ dispatch an event. """ 
     time.sleep(0.01)
     if not event: event = self.make_event()
     if not self.cfg: raise Exception("eventbase - cfg is not set .. can't handle event.") ; return
     if not event: raise NoEventProvided()
     self.ecounter += 1
     try:
         if event.isremote(): self.doremote(event) ; return
         if event.type == "groupchat" and event.fromm in self.ids:
             logging.debug("%s - receiving groupchat from self (%s)" % (self.cfg.name, event.fromm))
             return
         event.txt = self.inputmorphs.do(fromenc(event.txt, self.encoding), event)
     except UnicodeDecodeError: logging.warn("%s - got decode error in input .. ingoring" % self.cfg.name) ; return
     event.bind(self)
     try: logging.debug("%s - event dump: %s" % (self.cfg.name, event.dump()))
     except: pass
     self.status = "callback"
     starttime = time.time()
     if self.closed:
         if self.gatekeeper.isblocked(event.origin): return
     if event.status == "done":
         logging.debug("%s - event is done .. ignoring" % self.cfg.name)
         return
     if event.msg or event.isdcc: event.speed = 2
     e1 = cpy(event)
     first_callbacks.check(self, e1)
     if not e1.stop: 
         callbacks.check(self, e1)
         if not e1.stop: last_callbacks.check(self, e1)
     event.callbackdone = True
     waiter.check(self, event)
     return event
Пример #4
0
 def parsesocket(self, handler, message):
     """ parse request/response into a WebEvent. """
     self.handler = handler
     try: data = LazyDict(json.loads(message))
     except Exception as ex: logging.error("failed to parse data: %s - %s" % (message, str(ex))) ; return self
     logging.info("incoming: %s" % message)
     self.div = data.target
     self.userhost = tornado.escape.xhtml_escape(handler.current_user)
     if not self.userhost: raise Exception("no current user.")
     self.isweb = True
     input = data.cmnd
     self.how = data.how or self.how
     logging.warn("cmnd is %s - how is %s" % (input, self.how))
     self.txt = fromenc(input.strip(), self.bot.encoding)
     self.nick = self.userhost.split("@")[0]
     self.auth = fromenc(self.userhost)
     self.stripped = stripped(self.auth)
     self.channel = stripped(self.userhost)
     self.createdfrom  = str(handler)
     logging.debug('tornado - parsed - %s - %s' % (self.txt, self.userhost)) 
     self.prepare()
     return self
Пример #5
0
 def _readloop(self):
     """ loop on the socketfile. """
     self.stopreadloop = False
     self.stopped = False
     self.goreconnect = True
     timeout = 1
     logging.debug('%s - starting readloop' % self.cfg.name)
     prevtxt = ""
     while not self.stopped and not self.stopreadloop and self.sock and self.fsock:
         try:
             time.sleep(0.01)
             if 'ssl' in self.cfg and self.cfg['ssl']: intxt = self.sock.read().split('\n')
             else: intxt = self.fsock.readline().split('\n')
             if self.stopreadloop or self.stopped:
                 self.goreconnect = 0
                 break
             if intxt == ["",]:
                 logging.error("remote disconnected")
                 self.goreconnect = 1
                 break
             if prevtxt:
                 intxt[0] = prevtxt + intxt[0]
                 prevtxt = ""
             if intxt[-1] != '':
                 prevtxt = intxt[-1]
                 intxt = intxt[:-1]
             for r in intxt:
                 if not r: continue
                 try:
                     r = strippedtxt(r.rstrip(), ["\001", "\002", "\003"])
                     rr = str(fromenc(r.rstrip(), self.encoding))
                 except UnicodeDecodeError:
                     logging.warn("decode error - ignoring (%s)" % self.cfg.name)
                     continue
                 if not rr: continue
                 res = rr
                 try:
                     ievent = IrcEvent().parse(self, res)
                 except Exception as ex:
                     handle_exception()
                     continue
                 try:
                     if int(ievent.cmnd) > 400: logging.error("< %s - %s" % (res, self.cfg.name))
                     elif int(ievent.cmnd) >= 300: logging.info("< %s - %s" % (res, self.cfg.name))
                 except ValueError:
                     if not res.startswith("PING") and not res.startswith("NOTICE"): logging.warn("< %s - %s" % (res, self.cfg.name))
                     else: logging.info("< %s - %s" % (res, self.cfg.name))
                 if ievent: self.handle_ievent(ievent)
                 timeout = 1
         except UnicodeError as ex:
             self.error = str(ex)  
             logging.warn(self.error)
             handle_exception()
             continue
         except socket.timeout as ex:
             self.error = str(ex)
             logging.warn(self.error)
             if self.stopped or self.stopreadloop: break
             timeout += 1
             if timeout > 2:
                 self.goreconnect = True
                 logging.warn('no pong received (%s)' % self.cfg.name)
                 break
             pingsend = self.ping()
             if not pingsend: self.goreconnect = True ; break
             continue
         except ssl.SSLError as ex:
             self.error = str(ex)  
             logging.warn(self.error)
             if self.stopped or self.stopreadloop: break
             if not ex.errno == ETIMEOUT:
                 handle_exception()
                 self.goreconnect = True
                 break
             timeout += 1
             if timeout > 2:
                 self.goreconnect = True
                 logging.warn('no pong received (%s)' % self.cfg.name)
                 break
             logging.warn("socket timeout (%s)" % self.cfg.name)
             pingsend = self.ping()
             if not pingsend: self.goreconnect = True ; break
             handle_exception()
         except IOError as ex: 
             self.error = str(ex)
             logging.warn(self.error)
             if ex.errno in [EAGAIN, EPIPE, EBADF]: time.sleep(1) ; continue
             if not self.stopped:
                 logging.error('connecting error: %s (%s)' % (str(ex), self.cfg.name))
                 handle_exception()
                 self.goreconnect = True
             break
         except socket.error as ex:
             self.error = str(ex)  
             logging.warn(self.error)
             if ex.errno in [EAGAIN, EPIPE, EBADF]: time.sleep(0.5) ; continue
             if not self.stopped:
                 logging.error('connecting error: %s (%s)' % (str(ex), self.cfg.name))
                 self.goreconnect = True
             break
         except Exception as ex:
             self.error = str(ex)
             if self.stopped or self.stopreadloop: break
             self.goreconnect = True
             break
     logging.warn('readloop stopped - %s (%s)' % (self.error, self.cfg.name))
     self.connectok.clear()
     self.connected = False
     if self.goreconnect and not self.stopped:
         self.goreconnect = False
         time.sleep(2)
         self.reconnect()