diff mercurial/wireprotoserver.py @ 36403:b8d0761a85c7

wireproto: document the wonky push protocol for SSH It took me several minutes to figure out how the "unbundle" protocol worked. It turns out that the SSH protocol handler sends an empty reply that is interpreted as "OK to send" and only then does the client send the bundle payload. On top of that, the response is different depending on whether the operation was successful or not. I nearly pulled out my hair deciphering this. Differential Revision: https://phab.mercurial-scm.org/D2385
author Gregory Szorc <gregory.szorc@gmail.com>
date Wed, 21 Feb 2018 16:47:39 -0800
parents 0c231df1ffdc
children e7411fb7ba7f
line wrap: on
line diff
--- a/mercurial/wireprotoserver.py	Wed Feb 21 14:21:05 2018 -0800
+++ b/mercurial/wireprotoserver.py	Wed Feb 21 16:47:39 2018 -0800
@@ -347,12 +347,16 @@
         return [data[k] for k in keys]
 
     def forwardpayload(self, fpout):
+        # We initially send an empty response. This tells the client it is
+        # OK to start sending data. If a client sees any other response, it
+        # interprets it as an error.
+        _sshv1respondbytes(self._fout, b'')
+
         # The file is in the form:
         #
         # <chunk size>\n<chunk>
         # ...
         # 0\n
-        _sshv1respondbytes(self._fout, b'')
         count = int(self._fin.readline())
         while count:
             fpout.write(self._fin.read(count))