cinap_lenrekadd hg and python4bb9e2215 years agoHistory
588 lines · 18.1 KB · Python
RawDownload
     This class is instantiated for each request to be handled.  The    constructor sets the instance variables request, client_address    and server, and then calls the handle() method.  To implement a    specific service, all you need to do is to derive a class which    defines a handle() method.     The handle() method can find the request as self.request, the    client address as self.client_address, and the server (in case it    needs access to per-server information) as self.server.  Since a    separate instance is created for each request, the handle() method    can define arbitrary other instance variariables.     """     def __init__(self, request, client_address, server):        self.request = request        self.client_address = client_address        self.server = server        try:            self.setup()            self.handle()            self.finish()        finally:            sys.exc_traceback = None    # Help garbage collection     def setup(self):        pass     def handle(self):        pass     def finish(self):        pass  # The following two classes make it possible to use the same service# class for stream or datagram servers.# Each class sets up these instance variables:# - rfile: a file object from which receives the request is read# - wfile: a file object to which the reply is written# When the handle() method returns, wfile is flushed properly  class StreamRequestHandler(BaseRequestHandler):     """Define self.rfile and self.wfile for stream sockets."""     # Default buffer sizes for rfile, wfile.    # We default rfile to buffered because otherwise it could be    # really slow for large data (a getc() call per byte); we make    # wfile unbuffered because (a) often after a write() we want to    # read and we need to flush the line; (b) big writes to unbuffered    # files are typically optimized by stdio even when big reads    # aren't.    rbufsize = -1    wbufsize = 0     def setup(self):        self.connection = self.request        self.rfile = self.connection.makefile('rb', self.rbufsize)        self.wfile = self.connection.makefile('wb', self.wbufsize)     def finish(self):        if not self.wfile.closed:            self.wfile.flush()        self.wfile.close()        self.rfile.close()  class DatagramRequestHandler(BaseRequestHandler):     # XXX Regrettably, I cannot get this working on Linux;    # s.recvfrom() doesn't return a meaningful client address.     """Define self.rfile and self.wfile for datagram sockets."""     def setup(self):        try:            from cStringIO import StringIO        except ImportError:            from StringIO import StringIO        self.packet, self.socket = self.request        self.rfile = StringIO(self.packet)        self.wfile = StringIO()     def finish(self):        self.socket.sendto(self.wfile.getvalue(), self.client_address)

Lines 501–588 of 588. Previous lines