[Zope-Checkins] SVN: Zope/branches/publication-refactor/lib/python/ Twisted working with new publisher and old Request and Response objects.

Lennart Regebro regebro at gmail.com
Wed Apr 19 12:31:45 EDT 2006


Log message for revision 67146:
  Twisted working with new publisher and old Request and Response objects.
  

Changed:
  U   Zope/branches/publication-refactor/lib/python/OFS/Application.py
  U   Zope/branches/publication-refactor/lib/python/ZPublisher/HTTPRequest.py
  U   Zope/branches/publication-refactor/lib/python/ZPublisher/Publication.py
  U   Zope/branches/publication-refactor/lib/python/Zope2/Startup/__init__.py

-=-
Modified: Zope/branches/publication-refactor/lib/python/OFS/Application.py
===================================================================
--- Zope/branches/publication-refactor/lib/python/OFS/Application.py	2006-04-19 16:21:42 UTC (rev 67145)
+++ Zope/branches/publication-refactor/lib/python/OFS/Application.py	2006-04-19 16:31:45 UTC (rev 67146)
@@ -117,7 +117,6 @@
     Redirect = ZopeRedirect = PrincipiaRedirect
 
     def __bobo_traverse__(self, REQUEST, name=None):
-
         try: return getattr(self, name)
         except AttributeError: pass
         try: return self[name]

Modified: Zope/branches/publication-refactor/lib/python/ZPublisher/HTTPRequest.py
===================================================================
--- Zope/branches/publication-refactor/lib/python/ZPublisher/HTTPRequest.py	2006-04-19 16:21:42 UTC (rev 67145)
+++ Zope/branches/publication-refactor/lib/python/ZPublisher/HTTPRequest.py	2006-04-19 16:31:45 UTC (rev 67146)
@@ -1072,6 +1072,8 @@
         clone['PARENTS']=[self['PARENTS'][-1]]
         return clone
 
+    # XXX This is called getHeader in Response, and in Zope3 request.
+    # We should probably rename this getHeader and deprecate this.
     def get_header(self, name, default=None):
         """Return the named HTTP header, or an optional default
         argument or None if the header is not found. Note that

Modified: Zope/branches/publication-refactor/lib/python/ZPublisher/Publication.py
===================================================================
--- Zope/branches/publication-refactor/lib/python/ZPublisher/Publication.py	2006-04-19 16:21:42 UTC (rev 67145)
+++ Zope/branches/publication-refactor/lib/python/ZPublisher/Publication.py	2006-04-19 16:31:45 UTC (rev 67146)
@@ -92,8 +92,11 @@
         # Now, some code from ZPublisher.BaseRequest:
         # If the top object has a __bobo_traverse__ method, then use it
         # to possibly traverse to an alternate top-level object.
-        if hasattr(ob, '__bobo_traverse__'):
-            ob = ob.__bobo_traverse__(request)
+        try:
+            if hasattr(ob, '__bobo_traverse__'):
+                ob = ob.__bobo_traverse__(request)
+        except:
+            pass
 
         if hasattr(ob, '__of__'):
             # Try to bind the top-level object to the request
@@ -170,6 +173,8 @@
                                      sys.exc_info()[1],
                                      sys.exc_info()[2],
                                      )
+            except:
+                return request.response.exception()
         finally:
             self._abort()
 
@@ -255,6 +260,10 @@
 
 class Zope2BrowserRequest(BrowserRequest):
 
+    # Zope 2 compatibility XXX Deprecate!
+    def get_header(self, name, default=None):
+        return self.getHeader(name, default)
+
     def __init__(self, *args, **kw):
         self.other = {'PARENTS':[]}
         self._lazies = {}
@@ -283,7 +292,7 @@
         return v
 
     def traverse(self, object):
-        ob = super(BrowserRequest, self).traverse(object)
+        ob = super(Zope2BrowserRequest, self).traverse(object)
         self.other['PARENTS'].append(ob)
         return ob
 
@@ -326,7 +335,7 @@
                 if pathonly:
                     path = [''] + path[:n]
                 else:
-                    path = [other['SERVER_URL']] + path[:n]
+                    path = [self['SERVER_URL']] + path[:n]
                 URL = '/'.join(path)
                 if other.has_key('PUBLISHED'):
                     # Don't cache URLs until publishing traversal is done.
@@ -390,8 +399,76 @@
         if v is not _marker: return v
 
         return default
+    
+from ZPublisher.HTTPRequest import HTTPRequest
+from ZPublisher.HTTPResponse import HTTPResponse
+from cStringIO import StringIO
+import traceback
+from zope.publisher.http import status_reasons, DirectResult
 
+class Zope2HTTPResponse(HTTPResponse):
+    
+    def setResult(self, result):
+        """Sets the response result value.
+        """
+        self.setBody(result)
 
+    def handleException(self, exc_info):
+        """Handles an otherwise unhandled exception.
+
+        The publication object gets the first chance to handle an exception,
+        and if it doesn't have a good way to do it, it defers to the
+        response.  Implementations should set the reponse body.
+        """
+        f = StringIO()
+        traceback.print_exception(
+            exc_info[0]. exc_info[1], exc_info[2], 100, f)
+        self.setResult(f.getvalue())
+
+    def internalError(self):
+        'See IPublisherResponse'
+        self.setStatus(500, u"The engines can't take any more, Jim!")
+
+    def reset(self):
+        """Reset the output result.
+
+        Reset the response by nullifying already set variables.
+        """
+        raise Exception
+
+    def retry(self):
+        """Returns a retry response
+
+        Returns a response suitable for repeating the publication attempt.
+        """
+        raise Exception
+
+    def getStatusString(self):
+        'See IHTTPResponse'
+        return '%i %s' % (self.status, status_reasons[self.status])
+
+    def getHeaders(self):
+        return self.headers.items()    
+    
+    def consumeBodyIter(self):
+        return (self.body,)
+    
+
+class Zope2HTTPRequest(HTTPRequest):
+    
+    def supportsRetry(self):
+        return False
+    
+    def traverse(self, object):
+        path = self.get('PATH_INFO')
+        self['PARENTS'] = [self.publication.root]
+        return HTTPRequest.traverse(self, path)
+
+
+def Zope2RequestFactory(sin, env):
+    response=Zope2HTTPResponse() 
+    return Zope2HTTPRequest(sin, env, response)
+
 class Zope2HTTPFactory(object):
 
     implements(IRequestPublicationFactory)
@@ -400,4 +477,5 @@
         return True
 
     def __call__(self):
-        return Zope2BrowserRequest, ZopePublication
+
+        return Zope2RequestFactory, ZopePublication

Modified: Zope/branches/publication-refactor/lib/python/Zope2/Startup/__init__.py
===================================================================
--- Zope/branches/publication-refactor/lib/python/Zope2/Startup/__init__.py	2006-04-19 16:21:42 UTC (rev 67145)
+++ Zope/branches/publication-refactor/lib/python/Zope2/Startup/__init__.py	2006-04-19 16:31:45 UTC (rev 67146)
@@ -95,7 +95,10 @@
         self.makePidFile()
         self.setupInterpreter()
         self.startZope()
-        self.registerSignals()
+        from App.config import getConfiguration
+        config = getConfiguration()
+        if not config.twisted_servers:
+            self.registerSignals()
         # emit a "ready" message in order to prevent the kinds of emails
         # to the Zope maillist in which people claim that Zope has "frozen"
         # after it has emitted ZServer messages.
@@ -105,11 +108,15 @@
     def run(self):
         # the mainloop.
         try:
-            #import ZServer
-            #import Lifetime
-            #Lifetime.loop()
-            #sys.exit(ZServer.exit_code)
-            twisted.internet.reactor.run()
+            from App.config import getConfiguration
+            config = getConfiguration()
+            if config.twisted_servers:
+                twisted.internet.reactor.run()
+            else:
+                import ZServer
+                import Lifetime
+                Lifetime.loop()
+                sys.exit(ZServer.exit_code)
         finally:
             self.shutdown()
 



More information about the Zope-Checkins mailing list