[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