Patchwork D2783: hgweb: expose URL scheme and REMOTE_* attributes

login
register
mail settings
Submitter phabricator
Date March 11, 2018, 5:23 a.m.
Message ID <differential-rev-PHID-DREV-tdgenvwuaifiw7od6inp-req@phab.mercurial-scm.org>
Download mbox | patch
Permalink /patch/29277/
State Superseded
Headers show

Comments

phabricator - March 11, 2018, 5:23 a.m.
indygreg created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  These are consulted by the HTTP wire protocol handler by reading from
  the env dict. Let's expose them as attributes instead.
  
  With the wire protocol handler updates to use the new attributes, we
  no longer have any consumers of the legacy wsgirequest type in the
  wire protocol code (outside of a proxied call to the permissions
  checker). So, we remove most references to it.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D2783

AFFECTED FILES
  mercurial/hgweb/request.py
  mercurial/wireprotoserver.py

CHANGE DETAILS




To: indygreg, #hg-reviewers
Cc: mercurial-devel

Patch

diff --git a/mercurial/wireprotoserver.py b/mercurial/wireprotoserver.py
--- a/mercurial/wireprotoserver.py
+++ b/mercurial/wireprotoserver.py
@@ -53,8 +53,7 @@ 
     return ''.join(chunks)
 
 class httpv1protocolhandler(wireprototypes.baseprotocolhandler):
-    def __init__(self, wsgireq, req, ui, checkperm):
-        self._wsgireq = wsgireq
+    def __init__(self, req, ui, checkperm):
         self._req = req
         self._ui = ui
         self._checkperm = checkperm
@@ -117,9 +116,9 @@ 
 
     def client(self):
         return 'remote:%s:%s:%s' % (
-            self._wsgireq.env.get('wsgi.url_scheme') or 'http',
-            urlreq.quote(self._wsgireq.env.get('REMOTE_HOST', '')),
-            urlreq.quote(self._wsgireq.env.get('REMOTE_USER', '')))
+            self._req.urlscheme,
+            urlreq.quote(self._req.remotehost or ''),
+            urlreq.quote(self._req.remoteuser or ''))
 
     def addcapabilities(self, repo, caps):
         caps.append('httpheader=%d' %
@@ -197,15 +196,15 @@ 
         res.setbodybytes('0\n%s\n' % b'Not Found')
         return True
 
-    proto = httpv1protocolhandler(wsgireq, req, repo.ui,
+    proto = httpv1protocolhandler(req, repo.ui,
                                   lambda perm: checkperm(rctx, wsgireq, perm))
 
     # The permissions checker should be the only thing that can raise an
     # ErrorResponse. It is kind of a layer violation to catch an hgweb
     # exception here. So consider refactoring into a exception type that
     # is associated with the wire protocol.
     try:
-        _callhttp(repo, wsgireq, req, res, proto, cmd)
+        _callhttp(repo, req, res, proto, cmd)
     except hgwebcommon.ErrorResponse as e:
         for k, v in e.headers:
             res.headers[k] = v
@@ -256,7 +255,7 @@ 
     opts = {'level': ui.configint('server', 'zliblevel')}
     return HGTYPE, util.compengines['zlib'], opts
 
-def _callhttp(repo, wsgireq, req, res, proto, cmd):
+def _callhttp(repo, req, res, proto, cmd):
     # Avoid cycle involving hg module.
     from .hgweb import common as hgwebcommon
 
diff --git a/mercurial/hgweb/request.py b/mercurial/hgweb/request.py
--- a/mercurial/hgweb/request.py
+++ b/mercurial/hgweb/request.py
@@ -129,6 +129,12 @@ 
     # of HTTP: Host header for hostname. This is likely what clients used.
     advertisedurl = attr.ib()
     advertisedbaseurl = attr.ib()
+    # URL scheme (part before ``://``). e.g. ``http`` or ``https``.
+    urlscheme = attr.ib()
+    # Value of REMOTE_USER, if set, or None.
+    remoteuser = attr.ib()
+    # Value of REMOTE_HOST, if set, or None.
+    remotehost = attr.ib()
     # WSGI application path.
     apppath = attr.ib()
     # List of path parts to be used for dispatch.
@@ -270,6 +276,9 @@ 
                          url=fullurl, baseurl=baseurl,
                          advertisedurl=advertisedfullurl,
                          advertisedbaseurl=advertisedbaseurl,
+                         urlscheme=env['wsgi.url_scheme'],
+                         remoteuser=env.get('REMOTE_USER'),
+                         remotehost=env.get('REMOTE_HOST'),
                          apppath=apppath,
                          dispatchparts=dispatchparts, dispatchpath=dispatchpath,
                          havepathinfo='PATH_INFO' in env,