[Checkins] SVN: zope.server/trunk/ On startup, HTTPServer prints a clickable URL after the hostname/port.

Marius Gedminas marius at pov.lt
Sat Jan 7 00:10:42 UTC 2012


Log message for revision 123980:
  On startup, HTTPServer prints a clickable URL after the hostname/port.
  
  

Changed:
  U   zope.server/trunk/CHANGES.txt
  U   zope.server/trunk/src/zope/server/http/httpserver.py
  U   zope.server/trunk/src/zope/server/http/tests/test_httpserver.py
  U   zope.server/trunk/src/zope/server/serverbase.py
  U   zope.server/trunk/src/zope/server/tests/test_serverbase.py

-=-
Modified: zope.server/trunk/CHANGES.txt
===================================================================
--- zope.server/trunk/CHANGES.txt	2012-01-06 22:45:00 UTC (rev 123979)
+++ zope.server/trunk/CHANGES.txt	2012-01-07 00:10:42 UTC (rev 123980)
@@ -5,7 +5,7 @@
 3.8.6 (unreleased)
 ------------------
 
-- Nothing changed yet.
+- On startup, HTTPServer prints a clickable URL after the hostname/port.
 
 
 3.8.5 (2011-09-13)

Modified: zope.server/trunk/src/zope/server/http/httpserver.py
===================================================================
--- zope.server/trunk/src/zope/server/http/httpserver.py	2012-01-06 22:45:00 UTC (rev 123979)
+++ zope.server/trunk/src/zope/server/http/httpserver.py	2012-01-07 00:10:42 UTC (rev 123980)
@@ -35,7 +35,10 @@
         task.response_headers['Content-Length'] = str(len(body))
         task.write(body)
 
+    def getExtraLogMessage(self):
+        return '\n\tURL: http://%s:%d/' % (self.server_name, self.port)
 
+
 if __name__ == '__main__':
 
     from zope.server.taskthreads import ThreadedTaskDispatcher

Modified: zope.server/trunk/src/zope/server/http/tests/test_httpserver.py
===================================================================
--- zope.server/trunk/src/zope/server/http/tests/test_httpserver.py	2012-01-06 22:45:00 UTC (rev 123979)
+++ zope.server/trunk/src/zope/server/http/tests/test_httpserver.py	2012-01-07 00:10:42 UTC (rev 123980)
@@ -387,9 +387,30 @@
         self.failUnlessEqual(response.getheader('connection'), 'close')
 
 
+class TestHTTPServer(unittest.TestCase):
+
+    def setUp(self):
+        # Tests.setUp for the explanation why HTTPServer is not imported
+        # at the top
+        from zope.server.http.httpserver import HTTPServer
+        class MyServer(HTTPServer):
+            def __init__(self):
+                # don't call base class, we don't want real sockets here
+                self.server_name = 'example.com'
+                self.port = 8080
+        self.server = MyServer()
+
+    def test_getExtraLogMessage(self):
+        self.assertEqual(self.server.getExtraLogMessage(),
+                         '\n\tURL: http://example.com:8080/')
+
+
 def test_suite():
     loader = unittest.TestLoader()
-    return loader.loadTestsFromTestCase(Tests)
+    return unittest.TestSuite([
+        loader.loadTestsFromTestCase(Tests),
+        loader.loadTestsFromTestCase(TestHTTPServer),
+    ])
 
 if __name__=='__main__':
     unittest.TextTestRunner().run(test_suite())

Modified: zope.server/trunk/src/zope/server/serverbase.py
===================================================================
--- zope.server/trunk/src/zope/server/serverbase.py	2012-01-06 22:45:00 UTC (rev 123979)
+++ zope.server/trunk/src/zope/server/serverbase.py	2012-01-07 00:10:42 UTC (rev 123980)
@@ -95,13 +95,21 @@
         self.socket.listen(self.adj.backlog)  # Circumvent asyncore's NT limit
         if self.verbose:
             self.log_info('%s started.\n'
-                          '\tHostname: %s\n\tPort: %d' % (
+                          '\tHostname: %s\n\tPort: %d%s' % (
                 self.SERVER_IDENT,
                 self.server_name,
-                self.port
+                self.port,
+                self.getExtraLogMessage()
                 ))
 
+    def getExtraLogMessage(self):
+        r"""Additional information to be logged on startup.
 
+        If not empty, should start with '\n\t', and every line break should
+        be followed by a '\t'.
+        """
+        return ''
+
     def addTask(self, task):
         """See zope.server.interfaces.ITaskDispatcher"""
         td = self.task_dispatcher

Modified: zope.server/trunk/src/zope/server/tests/test_serverbase.py
===================================================================
--- zope.server/trunk/src/zope/server/tests/test_serverbase.py	2012-01-06 22:45:00 UTC (rev 123979)
+++ zope.server/trunk/src/zope/server/tests/test_serverbase.py	2012-01-07 00:10:42 UTC (rev 123980)
@@ -36,12 +36,48 @@
 
     """
 
+
+def doctest_ServerBase_startup_logging():
+    r"""Test for ServerBase verbose startup logging
+
+    We will use a subclass of ServerBase so that unit tests do not actually try
+    to bind to ports.
+
+        >>> from zope.server.serverbase import ServerBase
+        >>> class ServerBaseForTest(ServerBase):
+        ...     def bind(self, (ip, port)):
+        ...         self.socket = FakeSocket()
+        ...     def log_info(self, message, level='info'):
+        ...         print message.expandtabs()
+
+        >>> sb = ServerBaseForTest('example.com', 80, start=True, verbose=True)
+        zope.server.serverbase started.
+                Hostname: example.com
+                Port: 80
+
+    Subclasses can add extra information there
+
+        >>> class ServerForTest(ServerBaseForTest):
+        ...     def getExtraLogMessage(self):
+        ...         return '\n\tURL: http://example.com/'
+
+        >>> sb = ServerForTest('example.com', 80, start=True, verbose=True)
+        zope.server.serverbase started.
+                Hostname: example.com
+                Port: 80
+                URL: http://example.com/
+
+    """
+
 class FakeSocket:
     data        = ''
     setblocking = lambda *_: None
     fileno      = lambda *_: 42
     getpeername = lambda *_: ('localhost', 42)
 
+    def listen(self, *args):
+        pass
+
     def send(self, data):
         self.data += data
         return len(data)



More information about the checkins mailing list