Advertisement
Guest User

Untitled

a guest
Jun 27th, 2017
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.32 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.         self.fork = self.fork and fork
  24.         if not h: h = self.handler
  25.         if not path: path = getattr(self, "address", None)
  26.         if not path: raise ValueError ("default address not set")
  27.         self.hcls = h
  28.         self.workers = []
  29.         self.running = True
  30.         self.io = stream(path)
  31.         assert self.io.flags["server"]
  32.         self.set_signals("connected", "start")
  33.         self.start.connect(self.run)
  34.         self.connected.connect(self.hcls)
  35.     def run(self, pint=0.5, *oa, **ok):
  36.         fork = ok.pop("fork", self.fork)
  37.         async = ok.pop("async", self.async)
  38.         ok["server"] = True
  39.         self.io.open(*oa, **ok)
  40.         while self.running:
  41.             try:
  42.                 conn, addr = self.io.listen(pint)
  43.                 if not conn: continue
  44.                 io = stream("sock:").open(conn)
  45.             except KeyboardInterrupt:
  46.                 break
  47.             if fork:
  48.                 while len(self.workers) > self.max_children:
  49.                     time.sleep(0.1)
  50.             self.connected(
  51.                 self, io, addr,
  52.                 async=async, daemon=True, fork=fork
  53.             )
  54.         self.shutdown()
  55.     def shutdown(self):
  56.         if not self.running or self.fork: return
  57.         self.running = False
  58.         while self.workers:
  59.             h = self.workers.pop(0)
  60.             h.shutdown()
  61.         self.io.close()
  62.     class handler (object):
  63.         def __init__(self, server, io, addr, daemon=True):
  64.             object.__init__(self)
  65.             self.server = server
  66.             self.server.workers.append(self)
  67.             self.stream = io
  68.             self.client = addr
  69.             self.handle()
  70.             self.shutdown()
  71.         def handle(self): pass
  72.         def shutdown(self):
  73.             if self in self.server.workers:
  74.                 self.server.workers.remove(self)
  75.             try: self.stream.close()
  76.             except io_closed: pass
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement