--- 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)."""