[Zope-Checkins] CVS: Zope/lib/python/Zope/Startup - handlers.py:1.2.2.2

Fred L. Drake, Jr. fred@zope.com
Wed, 5 Feb 2003 18:29:47 -0500


Update of /cvs-repository/Zope/lib/python/Zope/Startup
In directory cvs.zope.org:/tmp/cvs-serv17177

Modified Files:
      Tag: new-install-branch
	handlers.py 
Log Message:
Remove lots of stuff; use the config support from the ZServer package
instead.


=== Zope/lib/python/Zope/Startup/handlers.py 1.2.2.1 => 1.2.2.2 ===
--- Zope/lib/python/Zope/Startup/handlers.py:1.2.2.1	Thu Jan 30 11:40:11 2003
+++ Zope/lib/python/Zope/Startup/handlers.py	Wed Feb  5 18:29:43 2003
@@ -146,31 +146,22 @@
             self._env[key] = value
         config.cgi_environment_variables = env
 
-        # set up server factories
-        factory = ServerFactoryFactory(config)
-        l = []
+        # if no servers are defined, create default http server and ftp server
+        if not config.servers:
+            import ZServer.datatypes
 
-        for section in config.servers:
-            # XXX ugly; need to clean this up soon
-            server_type = section.getSectionType().replace("-", "_")
-            for server_factory in getattr(factory, server_type)(section):
-                l.append((server_type, server_factory))
+            conf = DummyServerConfig(8080)
+            http = ZServer.datatypes.HTTPServerFactory(conf)
+            config.servers.append(http)
+
+            conf = DummyServerConfig(8021)
+            ftp = ZServer.datatypes.FTPServerFactory(conf)
+            config.servers.append(ftp)
 
-        # if no servers are defined, create default http server and ftp server
-        if not l:
-            class dummy:
-                pass
-            http, ftp = dummy(), dummy()
-
-            http.ports = [('', 8080)]
-            http.force_connection_close = 0
-            ftp.ports = [('', 8021)]
-
-            http = factory.http_server(http)[0]
-            ftp = factory.ftp_server(ftp)[0]
-            l.extend([('http_server', http), ('ftp_server', ftp)])
+        # prepare servers:
+        for section in config.servers:
+            self.prepare_server(section, config)
 
-        config.servers = l
 
         # set up defaults for zope_home and client_home if they're
         # not in the config
@@ -207,122 +198,34 @@
         opt_processor = cmdline.CommandLineOptions()
         opt_processor(config, self.options)
 
-class ServerFactoryFactory:
-    def __init__(self, config):
-        self._config = config
-        # alias some things for use in server handlers
-        from ZServer.AccessLogger import access_logger
-        self._logger = access_logger
-        import ZODB # :-( required to import user
-        from AccessControl.User import emergency_user
-        if hasattr(emergency_user, '__null_user__'):
-            self._pw = None
-        else:
-            self._pw = emergency_user._getPassword()
-        self._resolver = self.get_dns_resolver()
-        self._read_only = config.zserver_read_only_mode
-        self._default_ip = config.ip_address
-        self._env = config.cgi_environment_variables
-        self._module = 'Zope' # no longer settable
-
-    def get_dns_resolver(self):
-        if self._config.dns_ip_address:
-            from ZServer import resolver
-            return resolver.caching_resolver(self._config.dns_ip_address)
-
-    def http_server(self, section):
-        l = []
-        from ZServer import zhttp_server, zhttp_handler
-        for addr, port in section.ports:
-            def callback(inst, self=self):
-                handler = zhttp_handler(self._module, '', self._env)
-                inst.install_handler(handler)
-                if section.force_connection_close:
-                    handler._force_connection_close = 1
-            serverfactory = Factory('ZServer.zhttp_server', callback,
-                                    ip=addr, port=port,
-                                    resolver=self._resolver,
-                                    logger_object=self._logger)
-            l.append(serverfactory)
-        return l
-
-    def webdav_source_server(self, section):
-        l = []
-        for addr, port in section.ports:
-            def callback(inst, self=self):
-                from ZServer.WebDAVSrcHandler import WebDAVSrcHandler
-                handler = WebDAVSrcHandler(self._module, '', self._env)
-                inst.install_handler(handler)
-                if section.force_connection_close:
-                    handler._force_connection_close = 1
-            serverfactory = Factory('ZServer.zhttp_server', callback,
-                                    ip=addr, port=port,
-                                    resolver=self._resolver,
-                                    logger_object=self._logger)
-            l.append(serverfactory)
-        return l
-
-    def ftp_server(self, section):
-        l = []
-        for addr, port in section.ports:
-            serverfactory = Factory('ZServer.FTPServer', None,
-                                    module=self._module, ip=addr, port=port,
-                                    resolver=self._resolver,
-                                    logger_object=self._logger)
-            l.append(serverfactory)
-        return l
-
-    def pcgi_server(self, section):
-        if not self._read_only:
-            serverfactory = Factory('ZServer.PCGIServer', None,
-                                    module=self._module,
-                                    ip=self._default_ip,
-                                    pcgi_file=section.file,
-                                    resolver=self._resolver,
-                                    logger_object=self._logger)
-            return [serverfactory]
-        return []
-
-    def fcgi_server(self, section):
-        if section.file and section.port:
-            raise ValueError, ("Must specify either 'port' or 'file' in "
-                               "fcgi server configuration, but not both")
-        if section.port:
-            addr = section.port[0]
-            port = section.port[1]
-        else:
-            addr = port = None
-        file = section.file
-        if not self._read_only:
-            serverfactory = Factory('ZServer.FCGIServer', None,
-                                    module=self._module, ip=addr, port=port,
-                                    socket_file=file, resolver=self._resolver,
-                                    logger_object=self._logger)
-            return [serverfactory]
-        return []
-
-    def monitor_server(self, section):
-        if self._pw is None:
-            import zLOG
-            zLOG.LOG("z2", zLOG.WARNING, 'Monitor server not started'
-                     ' because no emergency user exists.')
-            return []
-        l = []
-        for addr, port in section.ports:
-            serverfactory = Factory('ZServer.secure_monitor_server', None,
-                                    password=self._pw,
-                                    hostname=addr,
-                                    port=port)
-            l.append(serverfactory)
-        return l
-
-    def icp_server(self, section):
-        l = []
-        for addr, port in section.ports:
-            serverfactory = Factory('ZServer.ICPServer.ICPServer', None,
-                                    addr, port)
-            l.append(serverfactory)
-        return l
+    _resolver = None
+
+    def get_dns_resolver(self, config):
+        if self._resolver is None and self._config.dns_ip_address:
+            from ZServer.medusa import resolver
+            r = resolver.caching_resolver(self._config.dns_ip_address)
+            self._resolver = r
+        return self._resolver
+
+    def prepare_server(self, factory, config):
+        import ZServer.AccessLogger
+        logger = ZServer.AccessLogger.access_logger
+        dnsresolver = self.get_dns_resolver(config)
+        # XXX need to get IP_ADDRESS
+        factory.prepare(IP_ADDRESS, resolver, logger, "Zope", env)
+
+
+class DummyServerConfig:
+    class _Thing:
+        pass
+
+    def __init__(self, port):
+        import socket
+        self.address = self._Thing()
+        self.address.family = socket.AF_INET
+        self.address.address = '', port
+        self.force_connection_close = 0
+
 
 def handleConfig(config, multihandler, options):
     handlers = {}