[PATCH 4 of 6 V2] hgweb: pass ui into preparehttpserver
Gregory Szorc
gregory.szorc at gmail.com
Wed Jul 13 03:18:10 EDT 2016
# HG changeset patch
# User Gregory Szorc <gregory.szorc at gmail.com>
# Date 1468394090 25200
# Wed Jul 13 00:14:50 2016 -0700
# Node ID 6955c5d8d037f824d3cc8e6f2abb53f77010eec3
# Parent 005dfad47596743676ac4146e2b9fc6cdafa407b
hgweb: pass ui into preparehttpserver
Upcoming patches will need the built-in HTTPS server to be more
configurable.
diff --git a/mercurial/hgweb/server.py b/mercurial/hgweb/server.py
--- a/mercurial/hgweb/server.py
+++ b/mercurial/hgweb/server.py
@@ -53,17 +53,17 @@ class _error_logger(object):
for msg in seq:
self.handler.log_error("HG error: %s", msg)
class _httprequesthandler(BaseHTTPServer.BaseHTTPRequestHandler):
url_scheme = 'http'
@staticmethod
- def preparehttpserver(httpserver, ssl_cert):
+ def preparehttpserver(httpserver, ui):
"""Prepare .socket of new HTTPServer instance"""
pass
def __init__(self, *args, **kargs):
self.protocol_version = 'HTTP/1.1'
BaseHTTPServer.BaseHTTPRequestHandler.__init__(self, *args, **kargs)
def _log_any(self, fp, format, *args):
@@ -217,25 +217,27 @@ class _httprequesthandler(BaseHTTPServer
self.wfile.flush()
class _httprequesthandlerssl(_httprequesthandler):
"""HTTPS handler based on Python's ssl module"""
url_scheme = 'https'
@staticmethod
- def preparehttpserver(httpserver, ssl_cert):
+ def preparehttpserver(httpserver, ui):
try:
import ssl
ssl.wrap_socket
except ImportError:
raise error.Abort(_("SSL support is unavailable"))
+
+ certfile = ui.config('web', 'certificate')
httpserver.socket = ssl.wrap_socket(
httpserver.socket, server_side=True,
- certfile=ssl_cert, ssl_version=ssl.PROTOCOL_TLSv1)
+ certfile=certfile, ssl_version=ssl.PROTOCOL_TLSv1)
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)
try:
import threading
@@ -259,17 +261,17 @@ class MercurialHTTPServer(object, _mixin
if os.name == 'nt':
allow_reuse_address = 0
def __init__(self, ui, app, addr, handler, **kwargs):
BaseHTTPServer.HTTPServer.__init__(self, addr, handler, **kwargs)
self.daemon_threads = True
self.application = app
- handler.preparehttpserver(self, ui.config('web', 'certificate'))
+ handler.preparehttpserver(self, ui)
prefix = ui.config('web', 'prefix', '')
if prefix:
prefix = '/' + prefix.strip('/')
self.prefix = prefix
alog = openlog(ui.config('web', 'accesslog', '-'), sys.stdout)
elog = openlog(ui.config('web', 'errorlog', '-'), sys.stderr)
diff --git a/tests/test-https.t b/tests/test-https.t
--- a/tests/test-https.t
+++ b/tests/test-https.t
@@ -399,22 +399,23 @@ Test https with cert problems through pr
Start patched hgweb that requires client certificates:
$ cat << EOT > reqclientcert.py
> import ssl
> from mercurial.hgweb import server
> class _httprequesthandlersslclientcert(server._httprequesthandlerssl):
> @staticmethod
- > def preparehttpserver(httpserver, ssl_cert):
+ > def preparehttpserver(httpserver, ui):
+ > certfile = ui.config('web', 'certificate')
> sslcontext = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
> sslcontext.verify_mode = ssl.CERT_REQUIRED
- > sslcontext.load_cert_chain(ssl_cert)
+ > sslcontext.load_cert_chain(certfile)
> # verify clients by server certificate
- > sslcontext.load_verify_locations(ssl_cert)
+ > sslcontext.load_verify_locations(certfile)
> httpserver.socket = sslcontext.wrap_socket(httpserver.socket,
> server_side=True)
> server._httprequesthandlerssl = _httprequesthandlersslclientcert
> EOT
$ cd test
$ hg serve -p $HGPORT -d --pid-file=../hg0.pid --certificate=$PRIV \
> --config extensions.reqclientcert=../reqclientcert.py
$ cat ../hg0.pid >> $DAEMON_PIDS
More information about the Mercurial-devel
mailing list