Patchwork [Bug,4886] New: server: support absolute urls

login
register
mail settings
Submitter mercurial-bugs@selenic.com
Date Oct. 6, 2015, 12:09 p.m.
Message ID <bug-4886-285@https.bz.mercurial-scm.org/>
Download mbox | patch
Permalink /patch/10829/
State Not Applicable
Headers show

Comments

mercurial-bugs@selenic.com - Oct. 6, 2015, 12:09 p.m.
https://bz.mercurial-scm.org/show_bug.cgi?id=4886

            Bug ID: 4886
           Summary: server: support absolute urls
           Product: Mercurial
           Version: default branch
          Hardware: PC
                OS: Windows
            Status: UNCONFIRMED
          Severity: feature
          Priority: wish
         Component: blackbox
          Assignee: bugzilla@selenic.com
          Reporter: charlieloveeric3@gmail.com
                CC: mercurial-devel@selenic.com

# HG changeset patch
# User timeless@mozdev.org
# Date 1443813482 14400
#      Fri Oct 02 15:18:02 2015 -0400
# Node ID 3afa079854db8653131291e10db34cf3bc440e35
# Parent  8bd5471f48ec17944c641e3b7fbb8a2d9a8f1865
server: support absolute urls (issue4877)

rfc2616 sec 5.1.2 says they should work;
tests on OS X 10.6 / Python 2.6 fail because
hg+tinyproxy generate these urls.

curl with tinyproxy:
"GET /?cmd=capabilities HTTP/1.1" 200 -
hg with tinyproxy:
"GET https://localhost:.../?cmd=capabilities HTTP/1.1" 404 -


   $ (get-with-headers.py localhost:$HGPORT 'file/tip/?style=raw')
@@ -334,7 +338,7 @@
 Test the access/error files are opened in append mode

   $ $PYTHON -c "print len(file('access.log').readlines()), 'log lines
written'"
-  14 log lines written
+  15 log lines written

 static file

Patch

diff --git a/mercurial/hgweb/server.py b/mercurial/hgweb/server.py
--- a/mercurial/hgweb/server.py
+++ b/mercurial/hgweb/server.py
@@ -7,6 +7,7 @@ 
 # GNU General Public License version 2 or any later version.

 import os, sys, errno, urllib, BaseHTTPServer, socket, SocketServer, traceback
+from urlparse import urlparse
 from mercurial import util, error
 from mercurial.hgweb import common
 from mercurial.i18n import _
@@ -90,9 +91,26 @@ 
         self.do_POST()

     def do_hgweb(self):
+        env = {}
+        parsed = urlparse(self.path)
+        if parsed.scheme and parsed.netloc:
+            # http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5.1.2
+            # To allow for transition to absoluteURIs in all requests in
+            # future versions of HTTP, all HTTP/1.1 servers MUST accept the
+            # absoluteURI form in requests, even though HTTP/1.1 clients will
+            # only generate them in requests to proxies.
+            server = parsed.netloc
+            self.path = self.path[self.path.find(server) + len(server):]
+            colon = server.rfind(':')
+            if colon > 1:
+                server = server[:colon]
+            # https://www.python.org/dev/peps/pep-0333/#environ-variables
+            # Note, however, that HTTP_HOST , if present, should be used in
+            # preference to SERVER_NAME for reconstructing the request URL.
+            # See the URL Reconstruction section below for more detail.
+            env['HTTP_HOST'] = server
         path, query = _splitURI(self.path)

-        env = {}
         env['GATEWAY_INTERFACE'] = 'CGI/1.1'
         env['REQUEST_METHOD'] = self.command
         env['SERVER_NAME'] = self.server.server_name
diff --git a/tests/test-hgweb.t b/tests/test-hgweb.t
--- a/tests/test-hgweb.t
+++ b/tests/test-hgweb.t
@@ -16,6 +16,10 @@ 
   $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E
errors.log
   $ cat hg.pid >> $DAEMON_PIDS

+supports rfcXXX gets
+  $ (get-with-headers.py localhost:$HGPORT --headeronly
"http://localhost:$HGPORT/?cmd=capabilities")
+  200 Script output follows
+
 manifest