[PATCH 1 of 2] hgweb: refactor all pyOpenSSL references into one class

Mads Kiilerich mads at kiilerich.com
Tue Oct 19 20:13:23 CDT 2010


# HG changeset patch
# User Mads Kiilerich <mads at kiilerich.com>
# Date 1287530019 -7200
# Node ID 5361b056f99045337d51821bade337482c9f6aa1
# Parent  c3316b6a32198a2a8257691a1233a9231222e503
hgweb: refactor all pyOpenSSL references into one class

diff --git a/mercurial/hgweb/server.py b/mercurial/hgweb/server.py
--- a/mercurial/hgweb/server.py
+++ b/mercurial/hgweb/server.py
@@ -33,10 +33,15 @@
         for msg in seq:
             self.handler.log_error("HG error:  %s", msg)
 
-class _hgwebhandler(BaseHTTPServer.BaseHTTPRequestHandler):
+class _httprequesthandler(BaseHTTPServer.BaseHTTPRequestHandler):
 
     url_scheme = 'http'
 
+    @staticmethod
+    def preparehttpserver(httpserver, ssl_cert):
+        """Prepare .socket of new HTTPServer instance"""
+        pass
+
     def __init__(self, *args, **kargs):
         self.protocol_version = 'HTTP/1.1'
         BaseHTTPServer.BaseHTTPRequestHandler.__init__(self, *args, **kargs)
@@ -168,28 +173,44 @@
         self.wfile.write(data)
         self.wfile.flush()
 
-class _shgwebhandler(_hgwebhandler):
+class _httprequesthandleropenssl(_httprequesthandler):
+    """HTTPS handler based on pyOpenSSL"""
 
     url_scheme = 'https'
 
+    @staticmethod
+    def preparehttpserver(httpserver, ssl_cert):
+        try:
+            import OpenSSL
+            OpenSSL.SSL.Context
+        except ImportError:
+            raise util.Abort(_("SSL support is unavailable"))
+        ctx = OpenSSL.SSL.Context(OpenSSL.SSL.SSLv23_METHOD)
+        ctx.use_privatekey_file(ssl_cert)
+        ctx.use_certificate_file(ssl_cert)
+        sock = socket.socket(httpserver.address_family, httpserver.socket_type)
+        httpserver.socket = OpenSSL.SSL.Connection(ctx, sock)
+        httpserver.server_bind()
+        httpserver.server_activate()
+
     def setup(self):
         self.connection = self.request
         self.rfile = socket._fileobject(self.request, "rb", self.rbufsize)
         self.wfile = socket._fileobject(self.request, "wb", self.wbufsize)
 
     def do_write(self):
-        from OpenSSL.SSL import SysCallError
+        import OpenSSL
         try:
-            _hgwebhandler.do_write(self)
-        except SysCallError, inst:
+            _httprequesthandler.do_write(self)
+        except OpenSSL.SSL.SysCallError, inst:
             if inst.args[0] != errno.EPIPE:
                 raise
 
     def handle_one_request(self):
-        from OpenSSL.SSL import SysCallError, ZeroReturnError
+        import OpenSSL
         try:
-            _hgwebhandler.handle_one_request(self)
-        except (SysCallError, ZeroReturnError):
+            _httprequesthandler.handle_one_request(self)
+        except (OpenSSL.SSL.SysCallError, OpenSSL.SSL.ZeroReturnError):
             self.close_connection = True
             pass
 
@@ -219,19 +240,7 @@
         self.daemon_threads = True
         self.application = app
 
-        ssl_cert = ui.config('web', 'certificate')
-        if ssl_cert:
-            try:
-                from OpenSSL import SSL
-                ctx = SSL.Context(SSL.SSLv23_METHOD)
-            except ImportError:
-                raise util.Abort(_("SSL support is unavailable"))
-            ctx.use_privatekey_file(ssl_cert)
-            ctx.use_certificate_file(ssl_cert)
-            sock = socket.socket(self.address_family, self.socket_type)
-            self.socket = SSL.Connection(ctx, sock)
-            self.server_bind()
-            self.server_activate()
+        handler.preparehttpserver(self, ui.config('web', 'certificate'))
 
         prefix = ui.config('web', 'prefix', '')
         if prefix:
@@ -256,9 +265,9 @@
 def create_server(ui, app):
 
     if ui.config('web', 'certificate'):
-        handler = _shgwebhandler
+        handler = _httprequesthandleropenssl
     else:
-        handler = _hgwebhandler
+        handler = _httprequesthandler
 
     if ui.configbool('web', 'ipv6'):
         cls = IPv6HTTPServer


More information about the Mercurial-devel mailing list