mercurial/httppeer.py
changeset 36218 e4ccd7a69f77
parent 35884 197d10e157ce
child 36219 a463f375f021
--- a/mercurial/httppeer.py	Mon Feb 12 16:35:06 2018 -0800
+++ b/mercurial/httppeer.py	Thu Feb 01 19:32:42 2018 -0800
@@ -252,6 +252,8 @@
         # with infinite recursion when trying to look up capabilities
         # for the first time.
         postargsok = self._caps is not None and 'httppostargs' in self._caps
+
+        # Send arguments via POST.
         if postargsok and args:
             strargs = urlreq.urlencode(sorted(args.items()))
             if not data:
@@ -265,11 +267,16 @@
                 argsio.length = len(strargs)
                 data = _multifile(argsio, data)
             headers[r'X-HgArgs-Post'] = len(strargs)
-        else:
-            if len(args) > 0:
-                httpheader = self.capable('httpheader')
-                if httpheader:
-                    headersize = int(httpheader.split(',', 1)[0])
+        elif args:
+            # Calling self.capable() can infinite loop if we are calling
+            # "capabilities". But that command should never accept wire
+            # protocol arguments. So this should never happen.
+            assert cmd != 'capabilities'
+            httpheader = self.capable('httpheader')
+            if httpheader:
+                headersize = int(httpheader.split(',', 1)[0])
+
+            # Send arguments via HTTP headers.
             if headersize > 0:
                 # The headers can typically carry more data than the URL.
                 encargs = urlreq.urlencode(sorted(args.items()))
@@ -277,8 +284,10 @@
                                                           headersize):
                     headers[header] = value
                     varyheaders.append(header)
+            # Send arguments via query string (Mercurial <1.9).
             else:
                 q += sorted(args.items())
+
         qs = '?%s' % urlreq.urlencode(q)
         cu = "%s%s" % (self._url, qs)
         size = 0