mercurial/wireprototypes.py
changeset 36371 0c231df1ffdc
parent 36074 2f7290555c96
child 36536 3cd245945ef3
--- a/mercurial/wireprototypes.py	Wed Feb 21 14:02:23 2018 -0800
+++ b/mercurial/wireprototypes.py	Wed Feb 21 14:21:05 2018 -0800
@@ -5,6 +5,8 @@
 
 from __future__ import absolute_import
 
+import abc
+
 class bytesresponse(object):
     """A wire protocol response consisting of raw bytes."""
     def __init__(self, data):
@@ -64,3 +66,52 @@
     """
     def __init__(self, gen=None):
         self.gen = gen
+
+class baseprotocolhandler(object):
+    """Abstract base class for wire protocol handlers.
+
+    A wire protocol handler serves as an interface between protocol command
+    handlers and the wire protocol transport layer. Protocol handlers provide
+    methods to read command arguments, redirect stdio for the duration of
+    the request, handle response types, etc.
+    """
+
+    __metaclass__ = abc.ABCMeta
+
+    @abc.abstractproperty
+    def name(self):
+        """The name of the protocol implementation.
+
+        Used for uniquely identifying the transport type.
+        """
+
+    @abc.abstractmethod
+    def getargs(self, args):
+        """return the value for arguments in <args>
+
+        returns a list of values (same order as <args>)"""
+
+    @abc.abstractmethod
+    def forwardpayload(self, fp):
+        """Read the raw payload and forward to a file.
+
+        The payload is read in full before the function returns.
+        """
+
+    @abc.abstractmethod
+    def mayberedirectstdio(self):
+        """Context manager to possibly redirect stdio.
+
+        The context manager yields a file-object like object that receives
+        stdout and stderr output when the context manager is active. Or it
+        yields ``None`` if no I/O redirection occurs.
+
+        The intent of this context manager is to capture stdio output
+        so it may be sent in the response. Some transports support streaming
+        stdio to the client in real time. For these transports, stdio output
+        won't be captured.
+        """
+
+    @abc.abstractmethod
+    def client(self):
+        """Returns a string representation of this client (as bytes)."""