Show More
@@ -308,3 +308,14 b' class PeerTransportError(Abort):' | |||||
308 | class InMemoryMergeConflictsError(Exception): |
|
308 | class InMemoryMergeConflictsError(Exception): | |
309 | """Exception raised when merge conflicts arose during an in-memory merge.""" |
|
309 | """Exception raised when merge conflicts arose during an in-memory merge.""" | |
310 | __bytes__ = _tobytes |
|
310 | __bytes__ = _tobytes | |
|
311 | ||||
|
312 | class WireprotoCommandError(Exception): | |||
|
313 | """Represents an error during execution of a wire protocol command. | |||
|
314 | ||||
|
315 | Should only be thrown by wire protocol version 2 commands. | |||
|
316 | ||||
|
317 | The error is a formatter string and an optional iterable of arguments. | |||
|
318 | """ | |||
|
319 | def __init__(self, message, args=None): | |||
|
320 | self.message = message | |||
|
321 | self.messageargs = args |
@@ -514,3 +514,6 b' error (optional)' | |||||
514 | message |
|
514 | message | |
515 | (array of maps) A message describing the error. The message uses the |
|
515 | (array of maps) A message describing the error. The message uses the | |
516 | same format as those in the ``Human Output Side-Channel`` frame. |
|
516 | same format as those in the ``Human Output Side-Channel`` frame. | |
|
517 | ||||
|
518 | TODO formalize when error frames can be seen and how errors can be | |||
|
519 | recognized midway through a command response. |
@@ -388,16 +388,14 b' def createcommandresponseframesfrombytes' | |||||
388 |
|
388 | |||
389 | def createbytesresponseframesfromgen(stream, requestid, gen, |
|
389 | def createbytesresponseframesfromgen(stream, requestid, gen, | |
390 | maxframesize=DEFAULT_MAX_FRAME_SIZE): |
|
390 | maxframesize=DEFAULT_MAX_FRAME_SIZE): | |
391 | overall = b''.join(cborutil.streamencode({b'status': b'ok'})) |
|
391 | """Generator of frames from a generator of byte chunks. | |
392 |
|
|
392 | ||
393 | yield stream.makeframe(requestid=requestid, |
|
393 | This assumes that another frame will follow whatever this emits. i.e. | |
394 | typeid=FRAME_TYPE_COMMAND_RESPONSE, |
|
394 | this always emits the continuation flag and never emits the end-of-stream | |
395 | flags=FLAG_COMMAND_RESPONSE_CONTINUATION, |
|
395 | flag. | |
396 | payload=overall) |
|
396 | """ | |
397 |
|
||||
398 | cb = util.chunkbuffer(gen) |
|
397 | cb = util.chunkbuffer(gen) | |
399 |
|
398 | flags = FLAG_COMMAND_RESPONSE_CONTINUATION | ||
400 | flags = 0 |
|
|||
401 |
|
399 | |||
402 | while True: |
|
400 | while True: | |
403 | chunk = cb.read(maxframesize) |
|
401 | chunk = cb.read(maxframesize) | |
@@ -411,11 +409,19 b' def createbytesresponseframesfromgen(str' | |||||
411 |
|
409 | |||
412 | flags |= FLAG_COMMAND_RESPONSE_CONTINUATION |
|
410 | flags |= FLAG_COMMAND_RESPONSE_CONTINUATION | |
413 |
|
411 | |||
414 | flags ^= FLAG_COMMAND_RESPONSE_CONTINUATION |
|
412 | def createcommandresponseokframe(stream, requestid): | |
415 | flags |= FLAG_COMMAND_RESPONSE_EOS |
|
413 | overall = b''.join(cborutil.streamencode({b'status': b'ok'})) | |
416 | yield stream.makeframe(requestid=requestid, |
|
414 | ||
|
415 | return stream.makeframe(requestid=requestid, | |||
417 | typeid=FRAME_TYPE_COMMAND_RESPONSE, |
|
416 | typeid=FRAME_TYPE_COMMAND_RESPONSE, | |
418 |
flags= |
|
417 | flags=FLAG_COMMAND_RESPONSE_CONTINUATION, | |
|
418 | payload=overall) | |||
|
419 | ||||
|
420 | def createcommandresponseeosframe(stream, requestid): | |||
|
421 | """Create an empty payload frame representing command end-of-stream.""" | |||
|
422 | return stream.makeframe(requestid=requestid, | |||
|
423 | typeid=FRAME_TYPE_COMMAND_RESPONSE, | |||
|
424 | flags=FLAG_COMMAND_RESPONSE_EOS, | |||
419 | payload=b'') |
|
425 | payload=b'') | |
420 |
|
426 | |||
421 | def createcommanderrorresponse(stream, requestid, message, args=None): |
|
427 | def createcommanderrorresponse(stream, requestid, message, args=None): | |
@@ -686,15 +692,70 b' class serverreactor(object):' | |||||
686 | 'framegen': result, |
|
692 | 'framegen': result, | |
687 | } |
|
693 | } | |
688 |
|
694 | |||
689 |
def oncommandresponseready |
|
695 | def oncommandresponsereadyobjects(self, stream, requestid, objs): | |
690 | """Signal that a bytes response is ready, with data as a generator.""" |
|
696 | """Signal that objects are ready to be sent to the client. | |
|
697 | ||||
|
698 | ``objs`` is an iterable of objects (typically a generator) that will | |||
|
699 | be encoded via CBOR and added to frames, which will be sent to the | |||
|
700 | client. | |||
|
701 | """ | |||
691 | ensureserverstream(stream) |
|
702 | ensureserverstream(stream) | |
692 |
|
703 | |||
|
704 | # We need to take care over exception handling. Uncaught exceptions | |||
|
705 | # when generating frames could lead to premature end of the frame | |||
|
706 | # stream and the possibility of the server or client process getting | |||
|
707 | # in a bad state. | |||
|
708 | # | |||
|
709 | # Keep in mind that if ``objs`` is a generator, advancing it could | |||
|
710 | # raise exceptions that originated in e.g. wire protocol command | |||
|
711 | # functions. That is why we differentiate between exceptions raised | |||
|
712 | # when iterating versus other exceptions that occur. | |||
|
713 | # | |||
|
714 | # In all cases, when the function finishes, the request is fully | |||
|
715 | # handled and no new frames for it should be seen. | |||
|
716 | ||||
693 | def sendframes(): |
|
717 | def sendframes(): | |
694 | for frame in createbytesresponseframesfromgen(stream, requestid, |
|
718 | emitted = False | |
695 | gen): |
|
719 | while True: | |
|
720 | try: | |||
|
721 | o = next(objs) | |||
|
722 | except StopIteration: | |||
|
723 | if emitted: | |||
|
724 | yield createcommandresponseeosframe(stream, requestid) | |||
|
725 | break | |||
|
726 | ||||
|
727 | except error.WireprotoCommandError as e: | |||
|
728 | for frame in createcommanderrorresponse( | |||
|
729 | stream, requestid, e.message, e.messageargs): | |||
|
730 | yield frame | |||
|
731 | break | |||
|
732 | ||||
|
733 | except Exception as e: | |||
|
734 | for frame in createerrorframe(stream, requestid, | |||
|
735 | '%s' % e, | |||
|
736 | errtype='server'): | |||
696 | yield frame |
|
737 | yield frame | |
697 |
|
738 | |||
|
739 | break | |||
|
740 | ||||
|
741 | try: | |||
|
742 | if not emitted: | |||
|
743 | yield createcommandresponseokframe(stream, requestid) | |||
|
744 | emitted = True | |||
|
745 | ||||
|
746 | # TODO buffer chunks so emitted frame payloads can be | |||
|
747 | # larger. | |||
|
748 | for frame in createbytesresponseframesfromgen( | |||
|
749 | stream, requestid, cborutil.streamencode(o)): | |||
|
750 | yield frame | |||
|
751 | except Exception as e: | |||
|
752 | for frame in createerrorframe(stream, requestid, | |||
|
753 | '%s' % e, | |||
|
754 | errtype='server'): | |||
|
755 | yield frame | |||
|
756 | ||||
|
757 | break | |||
|
758 | ||||
698 | self._activecommands.remove(requestid) |
|
759 | self._activecommands.remove(requestid) | |
699 |
|
760 | |||
700 | return self._handlesendframes(sendframes()) |
|
761 | return self._handlesendframes(sendframes()) |
@@ -106,27 +106,6 b' class streamreslegacy(object):' | |||||
106 | def __init__(self, gen=None): |
|
106 | def __init__(self, gen=None): | |
107 | self.gen = gen |
|
107 | self.gen = gen | |
108 |
|
108 | |||
109 | class cborresponse(object): |
|
|||
110 | """Encode the response value as CBOR.""" |
|
|||
111 | def __init__(self, v): |
|
|||
112 | self.value = v |
|
|||
113 |
|
||||
114 | class v2errorresponse(object): |
|
|||
115 | """Represents a command error for version 2 transports.""" |
|
|||
116 | def __init__(self, message, args=None): |
|
|||
117 | self.message = message |
|
|||
118 | self.args = args |
|
|||
119 |
|
||||
120 | class v2streamingresponse(object): |
|
|||
121 | """A response whose data is supplied by a generator. |
|
|||
122 |
|
||||
123 | The generator can either consist of data structures to CBOR |
|
|||
124 | encode or a stream of already-encoded bytes. |
|
|||
125 | """ |
|
|||
126 | def __init__(self, gen, compressible=True): |
|
|||
127 | self.gen = gen |
|
|||
128 | self.compressible = compressible |
|
|||
129 |
|
||||
130 | # list of nodes encoding / decoding |
|
109 | # list of nodes encoding / decoding | |
131 | def decodelist(l, sep=' '): |
|
110 | def decodelist(l, sep=' '): | |
132 | if l: |
|
111 | if l: |
@@ -124,6 +124,8 b' class clienthandler(object):' | |||||
124 | else: |
|
124 | else: | |
125 | raise e |
|
125 | raise e | |
126 |
|
126 | |||
|
127 | return | |||
|
128 | ||||
127 | if frame.requestid not in self._requests: |
|
129 | if frame.requestid not in self._requests: | |
128 | raise error.ProgrammingError( |
|
130 | raise error.ProgrammingError( | |
129 | 'received frame for unknown request; this is either a bug in ' |
|
131 | 'received frame for unknown request; this is either a bug in ' |
@@ -19,7 +19,6 b' from . import (' | |||||
19 | wireprototypes, |
|
19 | wireprototypes, | |
20 | ) |
|
20 | ) | |
21 | from .utils import ( |
|
21 | from .utils import ( | |
22 | cborutil, |
|
|||
23 | interfaceutil, |
|
22 | interfaceutil, | |
24 | ) |
|
23 | ) | |
25 |
|
24 | |||
@@ -295,31 +294,19 b' def _httpv2runcommand(ui, repo, req, res' | |||||
295 | res.setbodybytes(_('command in frame must match command in URL')) |
|
294 | res.setbodybytes(_('command in frame must match command in URL')) | |
296 | return True |
|
295 | return True | |
297 |
|
296 | |||
298 | rsp = dispatch(repo, proto, command['command']) |
|
|||
299 |
|
||||
300 | res.status = b'200 OK' |
|
297 | res.status = b'200 OK' | |
301 | res.headers[b'Content-Type'] = FRAMINGTYPE |
|
298 | res.headers[b'Content-Type'] = FRAMINGTYPE | |
302 |
|
299 | |||
303 | # TODO consider adding a type to represent an iterable of values to |
|
300 | try: | |
304 | # be CBOR encoded. |
|
301 | objs = dispatch(repo, proto, command['command']) | |
305 | if isinstance(rsp, wireprototypes.cborresponse): |
|
302 | ||
306 |
|
|
303 | action, meta = reactor.oncommandresponsereadyobjects( | |
307 | encoded = b''.join(cborutil.streamencode(rsp.value)) |
|
304 | outstream, command['requestid'], objs) | |
308 | action, meta = reactor.oncommandresponseready(outstream, |
|
305 | ||
309 | command['requestid'], |
|
306 | except Exception as e: | |
310 | encoded) |
|
|||
311 | elif isinstance(rsp, wireprototypes.v2streamingresponse): |
|
|||
312 | action, meta = reactor.oncommandresponsereadygen(outstream, |
|
|||
313 | command['requestid'], |
|
|||
314 | rsp.gen) |
|
|||
315 | elif isinstance(rsp, wireprototypes.v2errorresponse): |
|
|||
316 | action, meta = reactor.oncommanderror(outstream, |
|
|||
317 | command['requestid'], |
|
|||
318 | rsp.message, |
|
|||
319 | rsp.args) |
|
|||
320 | else: |
|
|||
321 | action, meta = reactor.onservererror( |
|
307 | action, meta = reactor.onservererror( | |
322 | _('unhandled response type from wire proto command')) |
|
308 | outstream, command['requestid'], | |
|
309 | _('exception when invoking command: %s') % e) | |||
323 |
|
310 | |||
324 | if action == 'sendframes': |
|
311 | if action == 'sendframes': | |
325 | res.setbodygen(meta['framegen']) |
|
312 | res.setbodygen(meta['framegen']) | |
@@ -430,6 +417,12 b' def wireprotocommand(name, args=None, pe' | |||||
430 | respectively. Default is to assume command requires ``push`` permissions |
|
417 | respectively. Default is to assume command requires ``push`` permissions | |
431 | because otherwise commands not declaring their permissions could modify |
|
418 | because otherwise commands not declaring their permissions could modify | |
432 | a repository that is supposed to be read-only. |
|
419 | a repository that is supposed to be read-only. | |
|
420 | ||||
|
421 | Wire protocol commands are generators of objects to be serialized and | |||
|
422 | sent to the client. | |||
|
423 | ||||
|
424 | If a command raises an uncaught exception, this will be translated into | |||
|
425 | a command error. | |||
433 | """ |
|
426 | """ | |
434 | transports = {k for k, v in wireprototypes.TRANSPORTS.items() |
|
427 | transports = {k for k, v in wireprototypes.TRANSPORTS.items() | |
435 | if v['version'] == 2} |
|
428 | if v['version'] == 2} | |
@@ -460,16 +453,12 b' def wireprotocommand(name, args=None, pe' | |||||
460 |
|
453 | |||
461 | @wireprotocommand('branchmap', permission='pull') |
|
454 | @wireprotocommand('branchmap', permission='pull') | |
462 | def branchmapv2(repo, proto): |
|
455 | def branchmapv2(repo, proto): | |
463 |
|
|
456 | yield {encoding.fromlocal(k): v | |
464 |
|
|
457 | for k, v in repo.branchmap().iteritems()} | |
465 |
|
458 | |||
466 | return wireprototypes.cborresponse(branchmap) |
|
|||
467 |
|
||||
468 | @wireprotocommand('capabilities', permission='pull') |
|
459 | @wireprotocommand('capabilities', permission='pull') | |
469 | def capabilitiesv2(repo, proto): |
|
460 | def capabilitiesv2(repo, proto): | |
470 |
|
|
461 | yield _capabilitiesv2(repo, proto) | |
471 |
|
||||
472 | return wireprototypes.cborresponse(caps) |
|
|||
473 |
|
462 | |||
474 | @wireprotocommand('heads', |
|
463 | @wireprotocommand('heads', | |
475 | args={ |
|
464 | args={ | |
@@ -480,7 +469,7 b' def headsv2(repo, proto, publiconly=Fals' | |||||
480 | if publiconly: |
|
469 | if publiconly: | |
481 | repo = repo.filtered('immutable') |
|
470 | repo = repo.filtered('immutable') | |
482 |
|
471 | |||
483 | return wireprototypes.cborresponse(repo.heads()) |
|
472 | yield repo.heads() | |
484 |
|
473 | |||
485 | @wireprotocommand('known', |
|
474 | @wireprotocommand('known', | |
486 | args={ |
|
475 | args={ | |
@@ -490,7 +479,7 b' def headsv2(repo, proto, publiconly=Fals' | |||||
490 | def knownv2(repo, proto, nodes=None): |
|
479 | def knownv2(repo, proto, nodes=None): | |
491 | nodes = nodes or [] |
|
480 | nodes = nodes or [] | |
492 | result = b''.join(b'1' if n else b'0' for n in repo.known(nodes)) |
|
481 | result = b''.join(b'1' if n else b'0' for n in repo.known(nodes)) | |
493 | return wireprototypes.cborresponse(result) |
|
482 | yield result | |
494 |
|
483 | |||
495 | @wireprotocommand('listkeys', |
|
484 | @wireprotocommand('listkeys', | |
496 | args={ |
|
485 | args={ | |
@@ -502,7 +491,7 b' def listkeysv2(repo, proto, namespace=No' | |||||
502 | keys = {encoding.fromlocal(k): encoding.fromlocal(v) |
|
491 | keys = {encoding.fromlocal(k): encoding.fromlocal(v) | |
503 | for k, v in keys.iteritems()} |
|
492 | for k, v in keys.iteritems()} | |
504 |
|
493 | |||
505 | return wireprototypes.cborresponse(keys) |
|
494 | yield keys | |
506 |
|
495 | |||
507 | @wireprotocommand('lookup', |
|
496 | @wireprotocommand('lookup', | |
508 | args={ |
|
497 | args={ | |
@@ -515,7 +504,7 b' def lookupv2(repo, proto, key):' | |||||
515 | # TODO handle exception. |
|
504 | # TODO handle exception. | |
516 | node = repo.lookup(key) |
|
505 | node = repo.lookup(key) | |
517 |
|
506 | |||
518 | return wireprototypes.cborresponse(node) |
|
507 | yield node | |
519 |
|
508 | |||
520 | @wireprotocommand('pushkey', |
|
509 | @wireprotocommand('pushkey', | |
521 | args={ |
|
510 | args={ | |
@@ -527,9 +516,7 b' def lookupv2(repo, proto, key):' | |||||
527 | permission='push') |
|
516 | permission='push') | |
528 | def pushkeyv2(repo, proto, namespace, key, old, new): |
|
517 | def pushkeyv2(repo, proto, namespace, key, old, new): | |
529 | # TODO handle ui output redirection |
|
518 | # TODO handle ui output redirection | |
530 |
|
|
519 | yield repo.pushkey(encoding.tolocal(namespace), | |
531 | encoding.tolocal(key), |
|
520 | encoding.tolocal(key), | |
532 | encoding.tolocal(old), |
|
521 | encoding.tolocal(old), | |
533 | encoding.tolocal(new)) |
|
522 | encoding.tolocal(new)) | |
534 |
|
||||
535 | return wireprototypes.cborresponse(r) |
|
@@ -176,8 +176,14 b' Request to read-only command works out o' | |||||
176 | s> Content-Type: application/mercurial-exp-framing-0005\r\n |
|
176 | s> Content-Type: application/mercurial-exp-framing-0005\r\n | |
177 | s> Transfer-Encoding: chunked\r\n |
|
177 | s> Transfer-Encoding: chunked\r\n | |
178 | s> \r\n |
|
178 | s> \r\n | |
179 |
s> 3 |
|
179 | s> 13\r\n | |
180 |
s> |
|
180 | s> \x0b\x00\x00\x01\x00\x02\x011\xa1FstatusBok | |
|
181 | s> \r\n | |||
|
182 | s> 27\r\n | |||
|
183 | s> \x1f\x00\x00\x01\x00\x02\x001X\x1dcustomreadonly bytes response | |||
|
184 | s> \r\n | |||
|
185 | s> 8\r\n | |||
|
186 | s> \x00\x00\x00\x01\x00\x02\x002 | |||
181 | s> \r\n |
|
187 | s> \r\n | |
182 | s> 0\r\n |
|
188 | s> 0\r\n | |
183 | s> \r\n |
|
189 | s> \r\n | |
@@ -203,13 +209,22 b' Request to read-only command works out o' | |||||
203 | s> Content-Type: application/mercurial-exp-framing-0005\r\n |
|
209 | s> Content-Type: application/mercurial-exp-framing-0005\r\n | |
204 | s> Transfer-Encoding: chunked\r\n |
|
210 | s> Transfer-Encoding: chunked\r\n | |
205 | s> \r\n |
|
211 | s> \r\n | |
206 |
s> 3 |
|
212 | s> 13\r\n | |
207 |
s> |
|
213 | s> \x0b\x00\x00\x01\x00\x02\x011 | |
208 | s> \xa1FstatusBokX\x1dcustomreadonly bytes response |
|
214 | s> \xa1FstatusBok | |
209 | s> \r\n |
|
215 | s> \r\n | |
210 |
received frame(size= |
|
216 | received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) | |
|
217 | s> 27\r\n | |||
|
218 | s> \x1f\x00\x00\x01\x00\x02\x001 | |||
|
219 | s> X\x1dcustomreadonly bytes response | |||
|
220 | s> \r\n | |||
|
221 | received frame(size=31; request=1; stream=2; streamflags=; type=command-response; flags=continuation) | |||
|
222 | s> 8\r\n | |||
|
223 | s> \x00\x00\x00\x01\x00\x02\x002 | |||
|
224 | s> \r\n | |||
211 |
|
|
225 | s> 0\r\n | |
212 | s> \r\n |
|
226 | s> \r\n | |
|
227 | received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) | |||
213 | response: [ |
|
228 | response: [ | |
214 | { |
|
229 | { | |
215 | b'status': b'ok' |
|
230 | b'status': b'ok' | |
@@ -322,8 +337,14 b' Authorized request for valid read-write ' | |||||
322 | s> Content-Type: application/mercurial-exp-framing-0005\r\n |
|
337 | s> Content-Type: application/mercurial-exp-framing-0005\r\n | |
323 | s> Transfer-Encoding: chunked\r\n |
|
338 | s> Transfer-Encoding: chunked\r\n | |
324 | s> \r\n |
|
339 | s> \r\n | |
325 |
s> 3 |
|
340 | s> 13\r\n | |
326 |
s> |
|
341 | s> \x0b\x00\x00\x01\x00\x02\x011\xa1FstatusBok | |
|
342 | s> \r\n | |||
|
343 | s> 27\r\n | |||
|
344 | s> \x1f\x00\x00\x01\x00\x02\x001X\x1dcustomreadonly bytes response | |||
|
345 | s> \r\n | |||
|
346 | s> 8\r\n | |||
|
347 | s> \x00\x00\x00\x01\x00\x02\x002 | |||
327 | s> \r\n |
|
348 | s> \r\n | |
328 | s> 0\r\n |
|
349 | s> 0\r\n | |
329 | s> \r\n |
|
350 | s> \r\n | |
@@ -445,8 +466,14 b' Multiple requests to regular command URL' | |||||
445 | s> Content-Type: application/mercurial-exp-framing-0005\r\n |
|
466 | s> Content-Type: application/mercurial-exp-framing-0005\r\n | |
446 | s> Transfer-Encoding: chunked\r\n |
|
467 | s> Transfer-Encoding: chunked\r\n | |
447 | s> \r\n |
|
468 | s> \r\n | |
448 |
s> 3 |
|
469 | s> 13\r\n | |
449 |
s> |
|
470 | s> \x0b\x00\x00\x01\x00\x02\x011\xa1FstatusBok | |
|
471 | s> \r\n | |||
|
472 | s> 27\r\n | |||
|
473 | s> \x1f\x00\x00\x01\x00\x02\x001X\x1dcustomreadonly bytes response | |||
|
474 | s> \r\n | |||
|
475 | s> 8\r\n | |||
|
476 | s> \x00\x00\x00\x01\x00\x02\x002 | |||
450 | s> \r\n |
|
477 | s> \r\n | |
451 | s> 0\r\n |
|
478 | s> 0\r\n | |
452 | s> \r\n |
|
479 | s> \r\n | |
@@ -478,11 +505,23 b' Multiple requests to "multirequest" URL ' | |||||
478 | s> Content-Type: application/mercurial-exp-framing-0005\r\n |
|
505 | s> Content-Type: application/mercurial-exp-framing-0005\r\n | |
479 | s> Transfer-Encoding: chunked\r\n |
|
506 | s> Transfer-Encoding: chunked\r\n | |
480 | s> \r\n |
|
507 | s> \r\n | |
481 |
s> 3 |
|
508 | s> 13\r\n | |
482 |
s> |
|
509 | s> \x0b\x00\x00\x01\x00\x02\x011\xa1FstatusBok | |
|
510 | s> \r\n | |||
|
511 | s> 27\r\n | |||
|
512 | s> \x1f\x00\x00\x01\x00\x02\x001X\x1dcustomreadonly bytes response | |||
|
513 | s> \r\n | |||
|
514 | s> 8\r\n | |||
|
515 | s> \x00\x00\x00\x01\x00\x02\x002 | |||
483 | s> \r\n |
|
516 | s> \r\n | |
484 |
s> 3 |
|
517 | s> 13\r\n | |
485 |
s> |
|
518 | s> \x0b\x00\x00\x03\x00\x02\x001\xa1FstatusBok | |
|
519 | s> \r\n | |||
|
520 | s> 27\r\n | |||
|
521 | s> \x1f\x00\x00\x03\x00\x02\x001X\x1dcustomreadonly bytes response | |||
|
522 | s> \r\n | |||
|
523 | s> 8\r\n | |||
|
524 | s> \x00\x00\x00\x03\x00\x02\x002 | |||
486 | s> \r\n |
|
525 | s> \r\n | |
487 | s> 0\r\n |
|
526 | s> 0\r\n | |
488 | s> \r\n |
|
527 | s> \r\n | |
@@ -516,11 +555,23 b' Interleaved requests to "multirequest" a' | |||||
516 | s> Content-Type: application/mercurial-exp-framing-0005\r\n |
|
555 | s> Content-Type: application/mercurial-exp-framing-0005\r\n | |
517 | s> Transfer-Encoding: chunked\r\n |
|
556 | s> Transfer-Encoding: chunked\r\n | |
518 | s> \r\n |
|
557 | s> \r\n | |
519 |
s> |
|
558 | s> 13\r\n | |
520 |
s> |
|
559 | s> \x0b\x00\x00\x03\x00\x02\x011\xa1FstatusBok | |
|
560 | s> \r\n | |||
|
561 | s> 28\r\n | |||
|
562 | s> \x00\x00\x03\x00\x02\x001\xa3Ibookmarks@Jnamespaces@Fphases@ | |||
|
563 | s> \r\n | |||
|
564 | s> 8\r\n | |||
|
565 | s> \x00\x00\x00\x03\x00\x02\x002 | |||
521 | s> \r\n |
|
566 | s> \r\n | |
522 |
s> 1 |
|
567 | s> 13\r\n | |
523 |
s> \x0 |
|
568 | s> \x0b\x00\x00\x01\x00\x02\x001\xa1FstatusBok | |
|
569 | s> \r\n | |||
|
570 | s> 9\r\n | |||
|
571 | s> \x01\x00\x00\x01\x00\x02\x001\xa0 | |||
|
572 | s> \r\n | |||
|
573 | s> 8\r\n | |||
|
574 | s> \x00\x00\x00\x01\x00\x02\x002 | |||
524 | s> \r\n |
|
575 | s> \r\n | |
525 | s> 0\r\n |
|
576 | s> 0\r\n | |
526 | s> \r\n |
|
577 | s> \r\n |
@@ -331,13 +331,22 b' Client with HTTPv2 enabled automatically' | |||||
331 | s> Content-Type: application/mercurial-exp-framing-0005\r\n |
|
331 | s> Content-Type: application/mercurial-exp-framing-0005\r\n | |
332 | s> Transfer-Encoding: chunked\r\n |
|
332 | s> Transfer-Encoding: chunked\r\n | |
333 | s> \r\n |
|
333 | s> \r\n | |
334 |
s> |
|
334 | s> 13\r\n | |
335 |
s> |
|
335 | s> \x0b\x00\x00\x01\x00\x02\x011 | |
336 | s> \xa1FstatusBok\x81T\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 |
|
336 | s> \xa1FstatusBok | |
337 | s> \r\n |
|
337 | s> \r\n | |
338 |
received frame(size= |
|
338 | received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) | |
|
339 | s> 1e\r\n | |||
|
340 | s> \x16\x00\x00\x01\x00\x02\x001 | |||
|
341 | s> \x81T\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 | |||
|
342 | s> \r\n | |||
|
343 | received frame(size=22; request=1; stream=2; streamflags=; type=command-response; flags=continuation) | |||
|
344 | s> 8\r\n | |||
|
345 | s> \x00\x00\x00\x01\x00\x02\x002 | |||
|
346 | s> \r\n | |||
339 | s> 0\r\n |
|
347 | s> 0\r\n | |
340 | s> \r\n |
|
348 | s> \r\n | |
|
349 | received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) | |||
341 | response: [ |
|
350 | response: [ | |
342 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' |
|
351 | b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' | |
343 | ] |
|
352 | ] |
@@ -59,14 +59,23 b' No arguments returns something reasonabl' | |||||
59 | s> Content-Type: application/mercurial-exp-framing-0005\r\n |
|
59 | s> Content-Type: application/mercurial-exp-framing-0005\r\n | |
60 | s> Transfer-Encoding: chunked\r\n |
|
60 | s> Transfer-Encoding: chunked\r\n | |
61 | s> \r\n |
|
61 | s> \r\n | |
62 |
s> |
|
62 | s> 13\r\n | |
63 |
s> |
|
63 | s> \x0b\x00\x00\x01\x00\x02\x011 | |
64 | s> \xa1FstatusBok\xa3Gbranch1\x81T\xb5\xfa\xac\xdf\xd2c7h\xcb1R3l\xc0\x953\x81&f\x88Gbranch2\x81T"Aa\xc7X\x9a\xa4\x8f\xa8:H\xfe\xff^\x95\xb5j\xe3\'\xfcGdefault\x82T&\x80Z\xba\x1e`\n |
|
64 | s> \xa1FstatusBok | |
|
65 | s> \r\n | |||
|
66 | received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) | |||
|
67 | s> 78\r\n | |||
|
68 | s> p\x00\x00\x01\x00\x02\x001 | |||
|
69 | s> \xa3Gbranch1\x81T\xb5\xfa\xac\xdf\xd2c7h\xcb1R3l\xc0\x953\x81&f\x88Gbranch2\x81T"Aa\xc7X\x9a\xa4\x8f\xa8:H\xfe\xff^\x95\xb5j\xe3\'\xfcGdefault\x82T&\x80Z\xba\x1e`\n | |||
65 | s> \x82\xe96a\x14\x9f#\x13\x86j"\x1a{T\xbe\x0e\xf7<\x17\xad\xe3\xfc\x89\xdcAp\x1e\xb9\xfc:\x91\xb5\x82\x82 |
|
70 | s> \x82\xe96a\x14\x9f#\x13\x86j"\x1a{T\xbe\x0e\xf7<\x17\xad\xe3\xfc\x89\xdcAp\x1e\xb9\xfc:\x91\xb5\x82\x82 | |
66 | s> \r\n |
|
71 | s> \r\n | |
67 |
received frame(size=12 |
|
72 | received frame(size=112; request=1; stream=2; streamflags=; type=command-response; flags=continuation) | |
|
73 | s> 8\r\n | |||
|
74 | s> \x00\x00\x00\x01\x00\x02\x002 | |||
|
75 | s> \r\n | |||
68 | s> 0\r\n |
|
76 | s> 0\r\n | |
69 | s> \r\n |
|
77 | s> \r\n | |
|
78 | received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) | |||
70 | response: { |
|
79 | response: { | |
71 | b'branch1': [ |
|
80 | b'branch1': [ | |
72 | b'\xb5\xfa\xac\xdf\xd2c7h\xcb1R3l\xc0\x953\x81&f\x88' |
|
81 | b'\xb5\xfa\xac\xdf\xd2c7h\xcb1R3l\xc0\x953\x81&f\x88' |
@@ -333,13 +333,22 b' capabilities command returns expected in' | |||||
333 | s> Content-Type: application/mercurial-exp-framing-0005\r\n |
|
333 | s> Content-Type: application/mercurial-exp-framing-0005\r\n | |
334 | s> Transfer-Encoding: chunked\r\n |
|
334 | s> Transfer-Encoding: chunked\r\n | |
335 | s> \r\n |
|
335 | s> \r\n | |
336 |
s> 1 |
|
336 | s> 13\r\n | |
337 |
s> \x |
|
337 | s> \x0b\x00\x00\x01\x00\x02\x011 | |
338 | s> \xa1FstatusBok\xa4Hcommands\xa7Ibranchmap\xa2Dargs\xa0Kpermissions\x81DpullLcapabilities\xa2Dargs\xa0Kpermissions\x81DpullEheads\xa2Dargs\xa1Jpubliconly\xf4Kpermissions\x81DpullEknown\xa2Dargs\xa1Enodes\x81HdeadbeefKpermissions\x81DpullHlistkeys\xa2Dargs\xa1InamespaceBnsKpermissions\x81DpullFlookup\xa2Dargs\xa1CkeyCfooKpermissions\x81DpullGpushkey\xa2Dargs\xa4CkeyCkeyInamespaceBnsCnewCnewColdColdKpermissions\x81DpushKcompression\x81\xa1DnameDzlibQframingmediatypes\x81X&application/mercurial-exp-framing-0005Nrawrepoformats\x82LgeneraldeltaHrevlogv1 |
|
338 | s> \xa1FstatusBok | |
339 | s> \r\n |
|
339 | s> \r\n | |
340 |
received frame(size= |
|
340 | received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) | |
|
341 | s> 1cc\r\n | |||
|
342 | s> \xc4\x01\x00\x01\x00\x02\x001 | |||
|
343 | s> \xa4Hcommands\xa7Ibranchmap\xa2Dargs\xa0Kpermissions\x81DpullLcapabilities\xa2Dargs\xa0Kpermissions\x81DpullEheads\xa2Dargs\xa1Jpubliconly\xf4Kpermissions\x81DpullEknown\xa2Dargs\xa1Enodes\x81HdeadbeefKpermissions\x81DpullHlistkeys\xa2Dargs\xa1InamespaceBnsKpermissions\x81DpullFlookup\xa2Dargs\xa1CkeyCfooKpermissions\x81DpullGpushkey\xa2Dargs\xa4CkeyCkeyInamespaceBnsCnewCnewColdColdKpermissions\x81DpushKcompression\x81\xa1DnameDzlibQframingmediatypes\x81X&application/mercurial-exp-framing-0005Nrawrepoformats\x82LgeneraldeltaHrevlogv1 | |||
|
344 | s> \r\n | |||
|
345 | received frame(size=452; request=1; stream=2; streamflags=; type=command-response; flags=continuation) | |||
|
346 | s> 8\r\n | |||
|
347 | s> \x00\x00\x00\x01\x00\x02\x002 | |||
|
348 | s> \r\n | |||
341 | s> 0\r\n |
|
349 | s> 0\r\n | |
342 | s> \r\n |
|
350 | s> \r\n | |
|
351 | received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) | |||
343 | response: [ |
|
352 | response: [ | |
344 | { |
|
353 | { | |
345 | b'status': b'ok' |
|
354 | b'status': b'ok' |
@@ -51,13 +51,22 b' All non-secret heads returned by default' | |||||
51 | s> Content-Type: application/mercurial-exp-framing-0005\r\n |
|
51 | s> Content-Type: application/mercurial-exp-framing-0005\r\n | |
52 | s> Transfer-Encoding: chunked\r\n |
|
52 | s> Transfer-Encoding: chunked\r\n | |
53 | s> \r\n |
|
53 | s> \r\n | |
54 |
s> |
|
54 | s> 13\r\n | |
55 |
s> |
|
55 | s> \x0b\x00\x00\x01\x00\x02\x011 | |
56 | s> \xa1FstatusBok\x83T\x1dok\x91\xd4J\xab\xa6\xd5\xe5\x80\xbc0\xa9\x94\x850\xdb\xe0\x0bT\xaeI.6\xb0\xc83\x9f\xfa\xf3(\xd0\x0b\x85\xb4R]\xe1\x16^T)Dm-\xc5A\x9c_\x97Dz\x8b\xc0b\xe4\xcc2\x8b\xf2A |
|
56 | s> \xa1FstatusBok | |
57 | s> \r\n |
|
57 | s> \r\n | |
58 |
received frame(size= |
|
58 | received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) | |
|
59 | s> 48\r\n | |||
|
60 | s> @\x00\x00\x01\x00\x02\x001 | |||
|
61 | s> \x83T\x1dok\x91\xd4J\xab\xa6\xd5\xe5\x80\xbc0\xa9\x94\x850\xdb\xe0\x0bT\xaeI.6\xb0\xc83\x9f\xfa\xf3(\xd0\x0b\x85\xb4R]\xe1\x16^T)Dm-\xc5A\x9c_\x97Dz\x8b\xc0b\xe4\xcc2\x8b\xf2A | |||
|
62 | s> \r\n | |||
|
63 | received frame(size=64; request=1; stream=2; streamflags=; type=command-response; flags=continuation) | |||
|
64 | s> 8\r\n | |||
|
65 | s> \x00\x00\x00\x01\x00\x02\x002 | |||
|
66 | s> \r\n | |||
59 |
|
|
67 | s> 0\r\n | |
60 | s> \r\n |
|
68 | s> \r\n | |
|
69 | received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) | |||
61 | response: [ |
|
70 | response: [ | |
62 | b'\x1dok\x91\xd4J\xab\xa6\xd5\xe5\x80\xbc0\xa9\x94\x850\xdb\xe0\x0b', |
|
71 | b'\x1dok\x91\xd4J\xab\xa6\xd5\xe5\x80\xbc0\xa9\x94\x850\xdb\xe0\x0b', | |
63 | b'\xaeI.6\xb0\xc83\x9f\xfa\xf3(\xd0\x0b\x85\xb4R]\xe1\x16^', |
|
72 | b'\xaeI.6\xb0\xc83\x9f\xfa\xf3(\xd0\x0b\x85\xb4R]\xe1\x16^', | |
@@ -88,13 +97,22 b' Requesting just the public heads works' | |||||
88 | s> Content-Type: application/mercurial-exp-framing-0005\r\n |
|
97 | s> Content-Type: application/mercurial-exp-framing-0005\r\n | |
89 | s> Transfer-Encoding: chunked\r\n |
|
98 | s> Transfer-Encoding: chunked\r\n | |
90 | s> \r\n |
|
99 | s> \r\n | |
91 |
s> |
|
100 | s> 13\r\n | |
92 |
s> |
|
101 | s> \x0b\x00\x00\x01\x00\x02\x011 | |
93 | s> \xa1FstatusBok\x81Tx\xd2\xdc\xa46\xb2\xf5\xb1\x88\xac&~)\xb8\x1e\x07&m8\xfc |
|
102 | s> \xa1FstatusBok | |
94 | s> \r\n |
|
103 | s> \r\n | |
95 |
received frame(size= |
|
104 | received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) | |
|
105 | s> 1e\r\n | |||
|
106 | s> \x16\x00\x00\x01\x00\x02\x001 | |||
|
107 | s> \x81Tx\xd2\xdc\xa46\xb2\xf5\xb1\x88\xac&~)\xb8\x1e\x07&m8\xfc | |||
|
108 | s> \r\n | |||
|
109 | received frame(size=22; request=1; stream=2; streamflags=; type=command-response; flags=continuation) | |||
|
110 | s> 8\r\n | |||
|
111 | s> \x00\x00\x00\x01\x00\x02\x002 | |||
|
112 | s> \r\n | |||
96 |
|
|
113 | s> 0\r\n | |
97 | s> \r\n |
|
114 | s> \r\n | |
|
115 | received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) | |||
98 | response: [ |
|
116 | response: [ | |
99 | b'x\xd2\xdc\xa46\xb2\xf5\xb1\x88\xac&~)\xb8\x1e\x07&m8\xfc' |
|
117 | b'x\xd2\xdc\xa46\xb2\xf5\xb1\x88\xac&~)\xb8\x1e\x07&m8\xfc' | |
100 | ] |
|
118 | ] |
@@ -43,13 +43,22 b' No arguments returns something reasonabl' | |||||
43 | s> Content-Type: application/mercurial-exp-framing-0005\r\n |
|
43 | s> Content-Type: application/mercurial-exp-framing-0005\r\n | |
44 | s> Transfer-Encoding: chunked\r\n |
|
44 | s> Transfer-Encoding: chunked\r\n | |
45 | s> \r\n |
|
45 | s> \r\n | |
46 |
s> 1 |
|
46 | s> 13\r\n | |
47 |
s> \x0 |
|
47 | s> \x0b\x00\x00\x01\x00\x02\x011 | |
48 |
s> \xa1FstatusBok |
|
48 | s> \xa1FstatusBok | |
49 | s> \r\n |
|
49 | s> \r\n | |
50 |
received frame(size=1 |
|
50 | received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) | |
|
51 | s> 9\r\n | |||
|
52 | s> \x01\x00\x00\x01\x00\x02\x001 | |||
|
53 | s> @ | |||
|
54 | s> \r\n | |||
|
55 | received frame(size=1; request=1; stream=2; streamflags=; type=command-response; flags=continuation) | |||
|
56 | s> 8\r\n | |||
|
57 | s> \x00\x00\x00\x01\x00\x02\x002 | |||
|
58 | s> \r\n | |||
51 |
|
|
59 | s> 0\r\n | |
52 | s> \r\n |
|
60 | s> \r\n | |
|
61 | received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) | |||
53 | response: [] |
|
62 | response: [] | |
54 |
|
63 | |||
55 | Single known node works |
|
64 | Single known node works | |
@@ -76,13 +85,22 b' Single known node works' | |||||
76 | s> Content-Type: application/mercurial-exp-framing-0005\r\n |
|
85 | s> Content-Type: application/mercurial-exp-framing-0005\r\n | |
77 | s> Transfer-Encoding: chunked\r\n |
|
86 | s> Transfer-Encoding: chunked\r\n | |
78 | s> \r\n |
|
87 | s> \r\n | |
79 |
s> 1 |
|
88 | s> 13\r\n | |
80 |
s> \ |
|
89 | s> \x0b\x00\x00\x01\x00\x02\x011 | |
81 |
s> \xa1FstatusBok |
|
90 | s> \xa1FstatusBok | |
82 | s> \r\n |
|
91 | s> \r\n | |
83 |
received frame(size=1 |
|
92 | received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) | |
|
93 | s> a\r\n | |||
|
94 | s> \x02\x00\x00\x01\x00\x02\x001 | |||
|
95 | s> A1 | |||
|
96 | s> \r\n | |||
|
97 | received frame(size=2; request=1; stream=2; streamflags=; type=command-response; flags=continuation) | |||
|
98 | s> 8\r\n | |||
|
99 | s> \x00\x00\x00\x01\x00\x02\x002 | |||
|
100 | s> \r\n | |||
84 |
|
|
101 | s> 0\r\n | |
85 | s> \r\n |
|
102 | s> \r\n | |
|
103 | received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) | |||
86 | response: [ |
|
104 | response: [ | |
87 | True |
|
105 | True | |
88 | ] |
|
106 | ] | |
@@ -111,13 +129,22 b' Multiple nodes works' | |||||
111 | s> Content-Type: application/mercurial-exp-framing-0005\r\n |
|
129 | s> Content-Type: application/mercurial-exp-framing-0005\r\n | |
112 | s> Transfer-Encoding: chunked\r\n |
|
130 | s> Transfer-Encoding: chunked\r\n | |
113 | s> \r\n |
|
131 | s> \r\n | |
114 |
s> 1 |
|
132 | s> 13\r\n | |
115 |
s> \x0 |
|
133 | s> \x0b\x00\x00\x01\x00\x02\x011 | |
116 |
s> \xa1FstatusBok |
|
134 | s> \xa1FstatusBok | |
117 | s> \r\n |
|
135 | s> \r\n | |
118 |
received frame(size=1 |
|
136 | received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) | |
|
137 | s> c\r\n | |||
|
138 | s> \x04\x00\x00\x01\x00\x02\x001 | |||
|
139 | s> C101 | |||
|
140 | s> \r\n | |||
|
141 | received frame(size=4; request=1; stream=2; streamflags=; type=command-response; flags=continuation) | |||
|
142 | s> 8\r\n | |||
|
143 | s> \x00\x00\x00\x01\x00\x02\x002 | |||
|
144 | s> \r\n | |||
119 |
|
|
145 | s> 0\r\n | |
120 | s> \r\n |
|
146 | s> \r\n | |
|
147 | received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) | |||
121 | response: [ |
|
148 | response: [ | |
122 | True, |
|
149 | True, | |
123 | False, |
|
150 | False, |
@@ -47,13 +47,22 b' Request for namespaces works' | |||||
47 | s> Content-Type: application/mercurial-exp-framing-0005\r\n |
|
47 | s> Content-Type: application/mercurial-exp-framing-0005\r\n | |
48 | s> Transfer-Encoding: chunked\r\n |
|
48 | s> Transfer-Encoding: chunked\r\n | |
49 | s> \r\n |
|
49 | s> \r\n | |
50 |
s> |
|
50 | s> 13\r\n | |
51 |
s> |
|
51 | s> \x0b\x00\x00\x01\x00\x02\x011 | |
52 | s> \xa1FstatusBok\xa3Ibookmarks@Jnamespaces@Fphases@ |
|
52 | s> \xa1FstatusBok | |
53 | s> \r\n |
|
53 | s> \r\n | |
54 |
received frame(size= |
|
54 | received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) | |
|
55 | s> 28\r\n | |||
|
56 | s> \x00\x00\x01\x00\x02\x001 | |||
|
57 | s> \xa3Ibookmarks@Jnamespaces@Fphases@ | |||
|
58 | s> \r\n | |||
|
59 | received frame(size=32; request=1; stream=2; streamflags=; type=command-response; flags=continuation) | |||
|
60 | s> 8\r\n | |||
|
61 | s> \x00\x00\x00\x01\x00\x02\x002 | |||
|
62 | s> \r\n | |||
55 |
|
|
63 | s> 0\r\n | |
56 | s> \r\n |
|
64 | s> \r\n | |
|
65 | received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) | |||
57 | response: { |
|
66 | response: { | |
58 | b'bookmarks': b'', |
|
67 | b'bookmarks': b'', | |
59 | b'namespaces': b'', |
|
68 | b'namespaces': b'', | |
@@ -84,13 +93,22 b' Request for phases works' | |||||
84 | s> Content-Type: application/mercurial-exp-framing-0005\r\n |
|
93 | s> Content-Type: application/mercurial-exp-framing-0005\r\n | |
85 | s> Transfer-Encoding: chunked\r\n |
|
94 | s> Transfer-Encoding: chunked\r\n | |
86 | s> \r\n |
|
95 | s> \r\n | |
87 |
s> |
|
96 | s> 13\r\n | |
88 |
s> |
|
97 | s> \x0b\x00\x00\x01\x00\x02\x011 | |
89 | s> \xa1FstatusBok\xa2X(be0ef73c17ade3fc89dc41701eb9fc3a91b58282A1JpublishingDTrue |
|
98 | s> \xa1FstatusBok | |
90 | s> \r\n |
|
99 | s> \r\n | |
91 |
received frame(size= |
|
100 | received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) | |
|
101 | s> 45\r\n | |||
|
102 | s> =\x00\x00\x01\x00\x02\x001 | |||
|
103 | s> \xa2X(be0ef73c17ade3fc89dc41701eb9fc3a91b58282A1JpublishingDTrue | |||
|
104 | s> \r\n | |||
|
105 | received frame(size=61; request=1; stream=2; streamflags=; type=command-response; flags=continuation) | |||
|
106 | s> 8\r\n | |||
|
107 | s> \x00\x00\x00\x01\x00\x02\x002 | |||
|
108 | s> \r\n | |||
92 |
|
|
109 | s> 0\r\n | |
93 | s> \r\n |
|
110 | s> \r\n | |
|
111 | received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) | |||
94 | response: { |
|
112 | response: { | |
95 | b'be0ef73c17ade3fc89dc41701eb9fc3a91b58282': b'1', |
|
113 | b'be0ef73c17ade3fc89dc41701eb9fc3a91b58282': b'1', | |
96 | b'publishing': b'True' |
|
114 | b'publishing': b'True' | |
@@ -120,13 +138,22 b' Request for bookmarks works' | |||||
120 | s> Content-Type: application/mercurial-exp-framing-0005\r\n |
|
138 | s> Content-Type: application/mercurial-exp-framing-0005\r\n | |
121 | s> Transfer-Encoding: chunked\r\n |
|
139 | s> Transfer-Encoding: chunked\r\n | |
122 | s> \r\n |
|
140 | s> \r\n | |
123 |
s> |
|
141 | s> 13\r\n | |
124 |
s> |
|
142 | s> \x0b\x00\x00\x01\x00\x02\x011 | |
125 | s> \xa1FstatusBok\xa1A@X(26805aba1e600a82e93661149f2313866a221a7b |
|
143 | s> \xa1FstatusBok | |
126 | s> \r\n |
|
144 | s> \r\n | |
127 |
received frame(size= |
|
145 | received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) | |
|
146 | s> 35\r\n | |||
|
147 | s> -\x00\x00\x01\x00\x02\x001 | |||
|
148 | s> \xa1A@X(26805aba1e600a82e93661149f2313866a221a7b | |||
|
149 | s> \r\n | |||
|
150 | received frame(size=45; request=1; stream=2; streamflags=; type=command-response; flags=continuation) | |||
|
151 | s> 8\r\n | |||
|
152 | s> \x00\x00\x00\x01\x00\x02\x002 | |||
|
153 | s> \r\n | |||
128 |
|
|
154 | s> 0\r\n | |
129 | s> \r\n |
|
155 | s> \r\n | |
|
156 | received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) | |||
130 | response: { |
|
157 | response: { | |
131 | b'@': b'26805aba1e600a82e93661149f2313866a221a7b' |
|
158 | b'@': b'26805aba1e600a82e93661149f2313866a221a7b' | |
132 | } |
|
159 | } |
@@ -43,13 +43,22 b' lookup for known node works' | |||||
43 | s> Content-Type: application/mercurial-exp-framing-0005\r\n |
|
43 | s> Content-Type: application/mercurial-exp-framing-0005\r\n | |
44 | s> Transfer-Encoding: chunked\r\n |
|
44 | s> Transfer-Encoding: chunked\r\n | |
45 | s> \r\n |
|
45 | s> \r\n | |
46 |
s> |
|
46 | s> 13\r\n | |
47 |
s> |
|
47 | s> \x0b\x00\x00\x01\x00\x02\x011 | |
48 | s> \xa1FstatusBokTBk\xad\xa5\xc6u\x98\xcae\x03mW\xd9\xe4\xb6K\x0c\x1c\xe7\xa0 |
|
48 | s> \xa1FstatusBok | |
49 | s> \r\n |
|
49 | s> \r\n | |
50 |
received frame(size= |
|
50 | received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) | |
|
51 | s> 1d\r\n | |||
|
52 | s> \x15\x00\x00\x01\x00\x02\x001 | |||
|
53 | s> TBk\xad\xa5\xc6u\x98\xcae\x03mW\xd9\xe4\xb6K\x0c\x1c\xe7\xa0 | |||
|
54 | s> \r\n | |||
|
55 | received frame(size=21; request=1; stream=2; streamflags=; type=command-response; flags=continuation) | |||
|
56 | s> 8\r\n | |||
|
57 | s> \x00\x00\x00\x01\x00\x02\x002 | |||
|
58 | s> \r\n | |||
51 |
|
|
59 | s> 0\r\n | |
52 | s> \r\n |
|
60 | s> \r\n | |
|
61 | received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) | |||
53 | response: b'Bk\xad\xa5\xc6u\x98\xcae\x03mW\xd9\xe4\xb6K\x0c\x1c\xe7\xa0' |
|
62 | response: b'Bk\xad\xa5\xc6u\x98\xcae\x03mW\xd9\xe4\xb6K\x0c\x1c\xe7\xa0' | |
54 |
|
63 | |||
55 | $ cat error.log |
|
64 | $ cat error.log |
@@ -46,13 +46,22 b' pushkey for a bookmark works' | |||||
46 | s> Content-Type: application/mercurial-exp-framing-0005\r\n |
|
46 | s> Content-Type: application/mercurial-exp-framing-0005\r\n | |
47 | s> Transfer-Encoding: chunked\r\n |
|
47 | s> Transfer-Encoding: chunked\r\n | |
48 | s> \r\n |
|
48 | s> \r\n | |
49 |
s> 1 |
|
49 | s> 13\r\n | |
50 |
s> \x0 |
|
50 | s> \x0b\x00\x00\x01\x00\x02\x011 | |
51 |
s> \xa1FstatusBok |
|
51 | s> \xa1FstatusBok | |
52 | s> \r\n |
|
52 | s> \r\n | |
53 |
received frame(size=1 |
|
53 | received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) | |
|
54 | s> 9\r\n | |||
|
55 | s> \x01\x00\x00\x01\x00\x02\x001 | |||
|
56 | s> \xf5 | |||
|
57 | s> \r\n | |||
|
58 | received frame(size=1; request=1; stream=2; streamflags=; type=command-response; flags=continuation) | |||
|
59 | s> 8\r\n | |||
|
60 | s> \x00\x00\x00\x01\x00\x02\x002 | |||
|
61 | s> \r\n | |||
54 |
|
|
62 | s> 0\r\n | |
55 | s> \r\n |
|
63 | s> \r\n | |
|
64 | received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) | |||
56 | response: True |
|
65 | response: True | |
57 |
|
66 | |||
58 | $ sendhttpv2peer << EOF |
|
67 | $ sendhttpv2peer << EOF | |
@@ -77,13 +86,22 b' pushkey for a bookmark works' | |||||
77 | s> Content-Type: application/mercurial-exp-framing-0005\r\n |
|
86 | s> Content-Type: application/mercurial-exp-framing-0005\r\n | |
78 | s> Transfer-Encoding: chunked\r\n |
|
87 | s> Transfer-Encoding: chunked\r\n | |
79 | s> \r\n |
|
88 | s> \r\n | |
80 |
s> |
|
89 | s> 13\r\n | |
81 |
s> |
|
90 | s> \x0b\x00\x00\x01\x00\x02\x011 | |
82 | s> \xa1FstatusBok\xa1A@X(426bada5c67598ca65036d57d9e4b64b0c1ce7a0 |
|
91 | s> \xa1FstatusBok | |
83 | s> \r\n |
|
92 | s> \r\n | |
84 |
received frame(size= |
|
93 | received frame(size=11; request=1; stream=2; streamflags=stream-begin; type=command-response; flags=continuation) | |
|
94 | s> 35\r\n | |||
|
95 | s> -\x00\x00\x01\x00\x02\x001 | |||
|
96 | s> \xa1A@X(426bada5c67598ca65036d57d9e4b64b0c1ce7a0 | |||
|
97 | s> \r\n | |||
|
98 | received frame(size=45; request=1; stream=2; streamflags=; type=command-response; flags=continuation) | |||
|
99 | s> 8\r\n | |||
|
100 | s> \x00\x00\x00\x01\x00\x02\x002 | |||
|
101 | s> \r\n | |||
85 |
|
|
102 | s> 0\r\n | |
86 | s> \r\n |
|
103 | s> \r\n | |
|
104 | received frame(size=0; request=1; stream=2; streamflags=; type=command-response; flags=eos) | |||
87 | response: { |
|
105 | response: { | |
88 | b'@': b'426bada5c67598ca65036d57d9e4b64b0c1ce7a0' |
|
106 | b'@': b'426bada5c67598ca65036d57d9e4b64b0c1ce7a0' | |
89 | } |
|
107 | } |
@@ -26,7 +26,7 b' def customreadonlyv1(repo, proto):' | |||||
26 |
|
26 | |||
27 | @wireprotov2server.wireprotocommand(b'customreadonly', permission=b'pull') |
|
27 | @wireprotov2server.wireprotocommand(b'customreadonly', permission=b'pull') | |
28 | def customreadonlyv2(repo, proto): |
|
28 | def customreadonlyv2(repo, proto): | |
29 |
|
|
29 | yield b'customreadonly bytes response' | |
30 |
|
30 | |||
31 | @wireprotov1server.wireprotocommand(b'customreadwrite', permission=b'push') |
|
31 | @wireprotov1server.wireprotocommand(b'customreadwrite', permission=b'push') | |
32 | def customreadwrite(repo, proto): |
|
32 | def customreadwrite(repo, proto): | |
@@ -34,7 +34,7 b' def customreadwrite(repo, proto):' | |||||
34 |
|
34 | |||
35 | @wireprotov2server.wireprotocommand(b'customreadwrite', permission=b'push') |
|
35 | @wireprotov2server.wireprotocommand(b'customreadwrite', permission=b'push') | |
36 | def customreadwritev2(repo, proto): |
|
36 | def customreadwritev2(repo, proto): | |
37 |
|
|
37 | yield b'customreadwrite bytes response' | |
38 | EOF |
|
38 | EOF | |
39 |
|
39 | |||
40 | cat >> $HGRCPATH << EOF |
|
40 | cat >> $HGRCPATH << EOF |
General Comments 0
You need to be logged in to leave comments.
Login now