Advertisement
Guest User

Untitled

a guest
Jun 27th, 2017
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.27 KB | None | 0 0
  1. """
  2. * ufw.io.server
  3. * ufw library
  4. provides:
  5.    classmodule io.server
  6. """
  7.  
  8. import os
  9. import time
  10. from select import select
  11. from ufw.errors import *
  12. from ufw.io.stream import *
  13. from ufw.core.object import *
  14.  
  15. __all__ = ["server"]
  16.  
  17. class server (object):
  18.     max_children = 50
  19.     fork = True
  20.     async = True
  21.     def __init__(self, path=None, h=None):
  22.         super(server, self).__init__()
  23.         if not h: h = self.handler
  24.         if not path: path = getattr(self, "address", None)
  25.         if not path: raise ValueError ("default address not set")
  26.         self.hcls = h
  27.         self.workers = []
  28.         self.running = True
  29.         self.io = stream(path)
  30.         assert self.io.flags["server"]
  31.         self.set_signals("connected", "start")
  32.         self.start.connect(self.run)
  33.         self.connected.connect(self.hcls)
  34.     def run(self, pint=0.5, *oa, **ok):
  35.         fork = ok.pop("fork", self.fork)
  36.         async = ok.pop("async", self.async)
  37.         ok["server"] = True
  38.         self.io.open(*oa, **ok)
  39.         while self.running:
  40.             try:
  41.                 conn, addr = self.io.listen(pint)
  42.                 if not conn: continue
  43.                 io = stream("sock:").open(conn)
  44.             except KeyboardInterrupt:
  45.                 break
  46.             if fork:
  47.                 while len(self.workers) > self.max_children:
  48.                     time.sleep(0.1)
  49.             self.connected(
  50.                 self, io, addr,
  51.                 async=async, daemon=True, fork=fork
  52.             )
  53.         self.shutdown()
  54.     def shutdown(self):
  55.         if not self.running: return
  56.         self.running = False
  57.         while self.workers:
  58.             h = self.workers.pop(0)
  59.             h.shutdown()
  60.         self.io.close()
  61.     class handler (object):
  62.         def __init__(self, server, io, addr, daemon=True):
  63.             object.__init__(self)
  64.             self.server = server
  65.             self.server.workers.append(self)
  66.             self.stream = io
  67.             self.client = addr
  68.             self.handle()
  69.             self.shutdown()
  70.         def handle(self): pass
  71.         def shutdown(self):
  72.             if self in self.server.workers:
  73.                 self.server.workers.remove(self)
  74.             try: self.stream.close()
  75.             except io_closed: pass
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement