##// END OF EJS Templates
wireprototypes: move wire protocol response types to new module...
Gregory Szorc -
r36090:cd6ab329 default
parent child Browse files
Show More
@@ -0,0 +1,61 b''
1 # Copyright 2018 Gregory Szorc <gregory.szorc@gmail.com>
2 #
3 # This software may be used and distributed according to the terms of the
4 # GNU General Public License version 2 or any later version.
5
6 from __future__ import absolute_import
7
8 class ooberror(object):
9 """wireproto reply: failure of a batch of operation
10
11 Something failed during a batch call. The error message is stored in
12 `self.message`.
13 """
14 def __init__(self, message):
15 self.message = message
16
17 class pushres(object):
18 """wireproto reply: success with simple integer return
19
20 The call was successful and returned an integer contained in `self.res`.
21 """
22 def __init__(self, res, output):
23 self.res = res
24 self.output = output
25
26 class pusherr(object):
27 """wireproto reply: failure
28
29 The call failed. The `self.res` attribute contains the error message.
30 """
31 def __init__(self, res, output):
32 self.res = res
33 self.output = output
34
35 class streamres(object):
36 """wireproto reply: binary stream
37
38 The call was successful and the result is a stream.
39
40 Accepts a generator containing chunks of data to be sent to the client.
41
42 ``prefer_uncompressed`` indicates that the data is expected to be
43 uncompressable and that the stream should therefore use the ``none``
44 engine.
45 """
46 def __init__(self, gen=None, prefer_uncompressed=False):
47 self.gen = gen
48 self.prefer_uncompressed = prefer_uncompressed
49
50 class streamreslegacy(object):
51 """wireproto reply: uncompressed binary stream
52
53 The call was successful and the result is a stream.
54
55 Accepts a generator containing chunks of data to be sent to the client.
56
57 Like ``streamres``, but sends an uncompressed data for "version 1" clients
58 using the application/mercurial-0.1 media type.
59 """
60 def __init__(self, gen=None):
61 self.gen = gen
@@ -31,11 +31,18 b' from . import ('
31 31 repository,
32 32 streamclone,
33 33 util,
34 wireprototypes,
34 35 )
35 36
36 37 urlerr = util.urlerr
37 38 urlreq = util.urlreq
38 39
40 ooberror = wireprototypes.ooberror
41 pushres = wireprototypes.pushres
42 pusherr = wireprototypes.pusherr
43 streamres = wireprototypes.streamres
44 streamres_legacy = wireprototypes.streamreslegacy
45
39 46 bundle2requiredmain = _('incompatible Mercurial client; bundle2 required')
40 47 bundle2requiredhint = _('see https://www.mercurial-scm.org/wiki/'
41 48 'IncompatibleClient')
@@ -477,60 +484,6 b' class wirepeer(repository.legacypeer):'
477 484 # server side
478 485
479 486 # wire protocol command can either return a string or one of these classes.
480 class streamres(object):
481 """wireproto reply: binary stream
482
483 The call was successful and the result is a stream.
484
485 Accepts a generator containing chunks of data to be sent to the client.
486
487 ``prefer_uncompressed`` indicates that the data is expected to be
488 uncompressable and that the stream should therefore use the ``none``
489 engine.
490 """
491 def __init__(self, gen=None, prefer_uncompressed=False):
492 self.gen = gen
493 self.prefer_uncompressed = prefer_uncompressed
494
495 class streamres_legacy(object):
496 """wireproto reply: uncompressed binary stream
497
498 The call was successful and the result is a stream.
499
500 Accepts a generator containing chunks of data to be sent to the client.
501
502 Like ``streamres``, but sends an uncompressed data for "version 1" clients
503 using the application/mercurial-0.1 media type.
504 """
505 def __init__(self, gen=None):
506 self.gen = gen
507
508 class pushres(object):
509 """wireproto reply: success with simple integer return
510
511 The call was successful and returned an integer contained in `self.res`.
512 """
513 def __init__(self, res, output):
514 self.res = res
515 self.output = output
516
517 class pusherr(object):
518 """wireproto reply: failure
519
520 The call failed. The `self.res` attribute contains the error message.
521 """
522 def __init__(self, res, output):
523 self.res = res
524 self.output = output
525
526 class ooberror(object):
527 """wireproto reply: failure of a batch of operation
528
529 Something failed during a batch call. The error message is stored in
530 `self.message`.
531 """
532 def __init__(self, message):
533 self.message = message
534 487
535 488 def getdispatchrepo(repo, proto, command):
536 489 """Obtain the repo used for processing wire protocol commands.
@@ -20,6 +20,7 b' from . import ('
20 20 pycompat,
21 21 util,
22 22 wireproto,
23 wireprototypes,
23 24 )
24 25
25 26 stringio = util.stringio
@@ -273,11 +274,11 b' def _callhttp(repo, req, proto, cmd):'
273 274 if isinstance(rsp, bytes):
274 275 req.respond(HTTP_OK, HGTYPE, body=rsp)
275 276 return []
276 elif isinstance(rsp, wireproto.streamres_legacy):
277 elif isinstance(rsp, wireprototypes.streamreslegacy):
277 278 gen = rsp.gen
278 279 req.respond(HTTP_OK, HGTYPE)
279 280 return gen
280 elif isinstance(rsp, wireproto.streamres):
281 elif isinstance(rsp, wireprototypes.streamres):
281 282 gen = rsp.gen
282 283
283 284 # This code for compression should not be streamres specific. It
@@ -291,18 +292,18 b' def _callhttp(repo, req, proto, cmd):'
291 292
292 293 req.respond(HTTP_OK, mediatype)
293 294 return gen
294 elif isinstance(rsp, wireproto.pushres):
295 elif isinstance(rsp, wireprototypes.pushres):
295 296 rsp = '%d\n%s' % (rsp.res, rsp.output)
296 297 req.respond(HTTP_OK, HGTYPE, body=rsp)
297 298 return []
298 elif isinstance(rsp, wireproto.pusherr):
299 elif isinstance(rsp, wireprototypes.pusherr):
299 300 # This is the httplib workaround documented in _handlehttperror().
300 301 req.drain()
301 302
302 303 rsp = '0\n%s\n' % rsp.res
303 304 req.respond(HTTP_OK, HGTYPE, body=rsp)
304 305 return []
305 elif isinstance(rsp, wireproto.ooberror):
306 elif isinstance(rsp, wireprototypes.ooberror):
306 307 rsp = rsp.message
307 308 req.respond(HTTP_OK, HGERRTYPE, body=rsp)
308 309 return []
@@ -434,16 +435,16 b' class sshserver(object):'
434 435
435 436 if isinstance(rsp, bytes):
436 437 _sshv1respondbytes(self._fout, rsp)
437 elif isinstance(rsp, wireproto.streamres):
438 elif isinstance(rsp, wireprototypes.streamres):
438 439 _sshv1respondstream(self._fout, rsp)
439 elif isinstance(rsp, wireproto.streamres_legacy):
440 elif isinstance(rsp, wireprototypes.streamreslegacy):
440 441 _sshv1respondstream(self._fout, rsp)
441 elif isinstance(rsp, wireproto.pushres):
442 elif isinstance(rsp, wireprototypes.pushres):
442 443 _sshv1respondbytes(self._fout, b'')
443 444 _sshv1respondbytes(self._fout, bytes(rsp.res))
444 elif isinstance(rsp, wireproto.pusherr):
445 elif isinstance(rsp, wireprototypes.pusherr):
445 446 _sshv1respondbytes(self._fout, rsp.res)
446 elif isinstance(rsp, wireproto.ooberror):
447 elif isinstance(rsp, wireprototypes.ooberror):
447 448 _sshv1respondooberror(self._fout, self._ui.ferr, rsp.message)
448 449 else:
449 450 raise error.ProgrammingError('unhandled response type from '
General Comments 0
You need to be logged in to leave comments. Login now