Mercurial > hg-stable
diff mercurial/wireprototypes.py @ 36402:0c231df1ffdc
wireprototypes: move baseprotocolhandler from wireprotoserver
This is needed to prevent a cycle in an upcoming commit.
Differential Revision: https://phab.mercurial-scm.org/D2384
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Wed, 21 Feb 2018 14:21:05 -0800 |
parents | 2f7290555c96 |
children | 3cd245945ef3 |
line wrap: on
line diff
--- 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)."""