##// END OF EJS Templates
wireprototypes: move baseprotocolhandler from wireprotoserver...
Gregory Szorc -
r36389:0c231df1 default
parent child Browse files
Show More
@@ -6,7 +6,6 b''
6 6
7 7 from __future__ import absolute_import
8 8
9 import abc
10 9 import contextlib
11 10 import struct
12 11 import sys
@@ -39,55 +38,6 b" SSHV1 = 'ssh-v1'"
39 38 # to reflect BC breakages.
40 39 SSHV2 = 'exp-ssh-v2-0001'
41 40
42 class baseprotocolhandler(object):
43 """Abstract base class for wire protocol handlers.
44
45 A wire protocol handler serves as an interface between protocol command
46 handlers and the wire protocol transport layer. Protocol handlers provide
47 methods to read command arguments, redirect stdio for the duration of
48 the request, handle response types, etc.
49 """
50
51 __metaclass__ = abc.ABCMeta
52
53 @abc.abstractproperty
54 def name(self):
55 """The name of the protocol implementation.
56
57 Used for uniquely identifying the transport type.
58 """
59
60 @abc.abstractmethod
61 def getargs(self, args):
62 """return the value for arguments in <args>
63
64 returns a list of values (same order as <args>)"""
65
66 @abc.abstractmethod
67 def forwardpayload(self, fp):
68 """Read the raw payload and forward to a file.
69
70 The payload is read in full before the function returns.
71 """
72
73 @abc.abstractmethod
74 def mayberedirectstdio(self):
75 """Context manager to possibly redirect stdio.
76
77 The context manager yields a file-object like object that receives
78 stdout and stderr output when the context manager is active. Or it
79 yields ``None`` if no I/O redirection occurs.
80
81 The intent of this context manager is to capture stdio output
82 so it may be sent in the response. Some transports support streaming
83 stdio to the client in real time. For these transports, stdio output
84 won't be captured.
85 """
86
87 @abc.abstractmethod
88 def client(self):
89 """Returns a string representation of this client (as bytes)."""
90
91 41 def decodevaluefromheaders(req, headerprefix):
92 42 """Decode a long value from multiple HTTP request headers.
93 43
@@ -105,7 +55,7 b' def decodevaluefromheaders(req, headerpr'
105 55
106 56 return ''.join(chunks)
107 57
108 class httpv1protocolhandler(baseprotocolhandler):
58 class httpv1protocolhandler(wireprototypes.baseprotocolhandler):
109 59 def __init__(self, req, ui):
110 60 self._req = req
111 61 self._ui = ui
@@ -364,7 +314,7 b' def _sshv1respondooberror(fout, ferr, rs'
364 314 fout.write(b'\n')
365 315 fout.flush()
366 316
367 class sshv1protocolhandler(baseprotocolhandler):
317 class sshv1protocolhandler(wireprototypes.baseprotocolhandler):
368 318 """Handler for requests services via version 1 of SSH protocol."""
369 319 def __init__(self, ui, fin, fout):
370 320 self._ui = ui
@@ -5,6 +5,8 b''
5 5
6 6 from __future__ import absolute_import
7 7
8 import abc
9
8 10 class bytesresponse(object):
9 11 """A wire protocol response consisting of raw bytes."""
10 12 def __init__(self, data):
@@ -64,3 +66,52 b' class streamreslegacy(object):'
64 66 """
65 67 def __init__(self, gen=None):
66 68 self.gen = gen
69
70 class baseprotocolhandler(object):
71 """Abstract base class for wire protocol handlers.
72
73 A wire protocol handler serves as an interface between protocol command
74 handlers and the wire protocol transport layer. Protocol handlers provide
75 methods to read command arguments, redirect stdio for the duration of
76 the request, handle response types, etc.
77 """
78
79 __metaclass__ = abc.ABCMeta
80
81 @abc.abstractproperty
82 def name(self):
83 """The name of the protocol implementation.
84
85 Used for uniquely identifying the transport type.
86 """
87
88 @abc.abstractmethod
89 def getargs(self, args):
90 """return the value for arguments in <args>
91
92 returns a list of values (same order as <args>)"""
93
94 @abc.abstractmethod
95 def forwardpayload(self, fp):
96 """Read the raw payload and forward to a file.
97
98 The payload is read in full before the function returns.
99 """
100
101 @abc.abstractmethod
102 def mayberedirectstdio(self):
103 """Context manager to possibly redirect stdio.
104
105 The context manager yields a file-object like object that receives
106 stdout and stderr output when the context manager is active. Or it
107 yields ``None`` if no I/O redirection occurs.
108
109 The intent of this context manager is to capture stdio output
110 so it may be sent in the response. Some transports support streaming
111 stdio to the client in real time. For these transports, stdio output
112 won't be captured.
113 """
114
115 @abc.abstractmethod
116 def client(self):
117 """Returns a string representation of this client (as bytes)."""
General Comments 0
You need to be logged in to leave comments. Login now