diff --git a/hgweb.cgi b/hgweb.cgi --- a/hgweb.cgi +++ b/hgweb.cgi @@ -22,10 +22,7 @@ cgitb.enable() #os.environ["HGENCODING"] = "UTF-8" from mercurial.hgweb.hgweb_mod import hgweb -from mercurial.hgweb.request import wsgiapplication import mercurial.hgweb.wsgicgi as wsgicgi -def make_web_app(): - return hgweb("/path/to/repo", "repository name") - -wsgicgi.launch(wsgiapplication(make_web_app)) +application = hgweb("/path/to/repo", "repository name") +wsgicgi.launch(application) diff --git a/hgwebdir.cgi b/hgwebdir.cgi --- a/hgwebdir.cgi +++ b/hgwebdir.cgi @@ -22,7 +22,6 @@ cgitb.enable() #os.environ["HGENCODING"] = "UTF-8" from mercurial.hgweb.hgwebdir_mod import hgwebdir -from mercurial.hgweb.request import wsgiapplication import mercurial.hgweb.wsgicgi as wsgicgi # The config file looks like this. You can have paths to individual @@ -44,7 +43,5 @@ import mercurial.hgweb.wsgicgi as wsgicg # Alternatively you can pass a list of ('virtual/path', '/real/path') tuples # or use a dictionary with entries like 'virtual/path': '/real/path' -def make_web_app(): - return hgwebdir("hgweb.config") - -wsgicgi.launch(wsgiapplication(make_web_app)) +application = hgwebdir('hgweb.config') +wsgicgi.launch(application) diff --git a/mercurial/hgweb/hgweb_mod.py b/mercurial/hgweb/hgweb_mod.py --- a/mercurial/hgweb/hgweb_mod.py +++ b/mercurial/hgweb/hgweb_mod.py @@ -13,6 +13,7 @@ from mercurial.i18n import gettext as _ from mercurial import mdiff, ui, hg, util, archival, streamclone, patch from mercurial import revlog, templater from common import ErrorResponse, get_mtime, staticfile, style_map, paritygen +from request import wsgirequest def _up(p): if p[0] != "/": @@ -671,10 +672,12 @@ class hgweb(object): if not os.environ.get('GATEWAY_INTERFACE', '').startswith("CGI/1."): raise RuntimeError("This function is only intended to be called while running as a CGI script.") import mercurial.hgweb.wsgicgi as wsgicgi - from request import wsgiapplication - def make_web_app(): - return self - wsgicgi.launch(wsgiapplication(make_web_app)) + wsgicgi.launch(self) + + def __call__(self, env, respond): + req = wsgirequest(env, respond) + self.run_wsgi(req) + return req def run_wsgi(self, req): def header(**map): diff --git a/mercurial/hgweb/hgwebdir_mod.py b/mercurial/hgweb/hgwebdir_mod.py --- a/mercurial/hgweb/hgwebdir_mod.py +++ b/mercurial/hgweb/hgwebdir_mod.py @@ -11,6 +11,7 @@ from mercurial.i18n import gettext as _ from mercurial import ui, hg, util, templater from common import ErrorResponse, get_mtime, staticfile, style_map, paritygen from hgweb_mod import hgweb +from request import wsgirequest # This is a stopgap class hgwebdir(object): @@ -60,10 +61,12 @@ class hgwebdir(object): if not os.environ.get('GATEWAY_INTERFACE', '').startswith("CGI/1."): raise RuntimeError("This function is only intended to be called while running as a CGI script.") import mercurial.hgweb.wsgicgi as wsgicgi - from request import wsgiapplication - def make_web_app(): - return self - wsgicgi.launch(wsgiapplication(make_web_app)) + wsgicgi.launch(self) + + def __call__(self, env, respond): + req = wsgirequest(env, respond) + self.run_wsgi(req) + return req def run_wsgi(self, req): def header(**map): diff --git a/mercurial/hgweb/request.py b/mercurial/hgweb/request.py --- a/mercurial/hgweb/request.py +++ b/mercurial/hgweb/request.py @@ -10,15 +10,8 @@ import socket, cgi, errno from mercurial.i18n import gettext as _ from common import ErrorResponse, statusmessage -class wsgiapplication(object): - def __init__(self, destmaker): - self.destmaker = destmaker - - def __call__(self, wsgienv, start_response): - return _wsgirequest(self.destmaker(), wsgienv, start_response) - -class _wsgirequest(object): - def __init__(self, destination, wsgienv, start_response): +class wsgirequest(object): + def __init__(self, wsgienv, start_response): version = wsgienv['wsgi.version'] if (version < (1, 0)) or (version >= (2, 0)): raise RuntimeError("Unknown and unsupported WSGI version %d.%d" @@ -33,7 +26,6 @@ class _wsgirequest(object): self.form = cgi.parse(self.inp, self.env, keep_blank_values=1) self.start_response = start_response self.headers = [] - destination.run_wsgi(self) out = property(lambda self: self) @@ -92,3 +84,9 @@ class _wsgirequest(object): if length: headers.append(('Content-length', str(length))) self.header(headers) + +def wsgiapplication(app_maker): + application = app_maker() + def run_wsgi(env, respond): + application(env, respond) + return run_wsgi diff --git a/mercurial/hgweb/server.py b/mercurial/hgweb/server.py --- a/mercurial/hgweb/server.py +++ b/mercurial/hgweb/server.py @@ -10,7 +10,6 @@ import os, sys, errno, urllib, BaseHTTPS from mercurial import ui, hg, util, templater from hgweb_mod import hgweb from hgwebdir_mod import hgwebdir -from request import wsgiapplication from mercurial.i18n import gettext as _ def _splitURI(uri): @@ -121,10 +120,7 @@ class _hgwebhandler(object, BaseHTTPServ self.saved_headers = [] self.sent_headers = False self.length = None - req = self.server.reqmaker(env, self._start_response) - for data in req: - if data: - self._write(data) + self.server.application(env, self._start_response) def send_headers(self): if not self.saved_status: @@ -250,7 +246,7 @@ def create_server(ui, repo): raise hg.RepoError(_("There is no Mercurial repository here" " (.hg not found)")) return hgwebobj - self.reqmaker = wsgiapplication(make_handler) + self.application = make_handler() addr = address if addr in ('', '::'): diff --git a/tests/test-non-interactive-wsgi b/tests/test-non-interactive-wsgi --- a/tests/test-non-interactive-wsgi +++ b/tests/test-non-interactive-wsgi @@ -11,7 +11,6 @@ hg tip cat > request.py <