/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/smart/protocol.py

  • Committer: Ian Clatworthy
  • Date: 2008-12-15 06:18:29 UTC
  • mfrom: (3905 +trunk)
  • mto: (3586.1.23 views-ui)
  • mto: This revision was merged to the branch mainline in revision 4030.
  • Revision ID: ian.clatworthy@canonical.com-20081215061829-c8qwa93g71u9fsh5
merge bzr.dev 3905

Show diffs side-by-side

added added

removed removed

Lines of Context:
323
323
 
324
324
    def __init__(self):
325
325
        self.finished_reading = False
326
 
        self._in_buffer = ''
 
326
        self._in_buffer_list = []
 
327
        self._in_buffer_len = 0
327
328
        self.unused_data = ''
328
329
        self.bytes_left = None
329
330
        self._number_needed_bytes = None
330
331
 
 
332
    def _get_in_buffer(self):
 
333
        if len(self._in_buffer_list) == 1:
 
334
            return self._in_buffer_list[0]
 
335
        in_buffer = ''.join(self._in_buffer_list)
 
336
        if len(in_buffer) != self._in_buffer_len:
 
337
            raise AssertionError(
 
338
                "Length of buffer did not match expected value: %s != %s"
 
339
                % self._in_buffer_len, len(in_buffer))
 
340
        self._in_buffer_list = [in_buffer]
 
341
        return in_buffer
 
342
 
 
343
    def _get_in_bytes(self, count):
 
344
        """Grab X bytes from the input_buffer.
 
345
 
 
346
        Callers should have already checked that self._in_buffer_len is >
 
347
        count. Note, this does not consume the bytes from the buffer. The
 
348
        caller will still need to call _get_in_buffer() and then
 
349
        _set_in_buffer() if they actually need to consume the bytes.
 
350
        """
 
351
        # check if we can yield the bytes from just the first entry in our list
 
352
        if len(self._in_buffer_list) == 0:
 
353
            raise AssertionError('Callers must be sure we have buffered bytes'
 
354
                ' before calling _get_in_bytes')
 
355
        if len(self._in_buffer_list[0]) > count:
 
356
            return self._in_buffer_list[0][:count]
 
357
        # We can't yield it from the first buffer, so collapse all buffers, and
 
358
        # yield it from that
 
359
        in_buf = self._get_in_buffer()
 
360
        return in_buf[:count]
 
361
 
 
362
    def _set_in_buffer(self, new_buf):
 
363
        if new_buf is not None:
 
364
            self._in_buffer_list = [new_buf]
 
365
            self._in_buffer_len = len(new_buf)
 
366
        else:
 
367
            self._in_buffer_list = []
 
368
            self._in_buffer_len = 0
 
369
 
331
370
    def accept_bytes(self, bytes):
332
371
        """Decode as much of bytes as possible.
333
372
 
338
377
        data will be appended to self.unused_data.
339
378
        """
340
379
        # accept_bytes is allowed to change the state
341
 
        current_state = self.state_accept
342
380
        self._number_needed_bytes = None
343
 
        self._in_buffer += bytes
 
381
        # lsprof puts a very large amount of time on this specific call for
 
382
        # large readv arrays
 
383
        self._in_buffer_list.append(bytes)
 
384
        self._in_buffer_len += len(bytes)
344
385
        try:
345
386
            # Run the function for the current state.
 
387
            current_state = self.state_accept
346
388
            self.state_accept()
347
389
            while current_state != self.state_accept:
348
390
                # The current state has changed.  Run the function for the new
379
421
            # the rest of this chunk plus an END chunk.
380
422
            return self.bytes_left + 4
381
423
        elif self.state_accept == self._state_accept_expecting_length:
382
 
            if self._in_buffer == '':
 
424
            if self._in_buffer_len == 0:
383
425
                # We're expecting a chunk length.  There's at least two bytes
384
426
                # left: a digit plus '\n'.
385
427
                return 2
390
432
        elif self.state_accept == self._state_accept_reading_unused:
391
433
            return 1
392
434
        elif self.state_accept == self._state_accept_expecting_header:
393
 
            return max(0, len('chunked\n') - len(self._in_buffer))
 
435
            return max(0, len('chunked\n') - self._in_buffer_len)
394
436
        else:
395
437
            raise AssertionError("Impossible state: %r" % (self.state_accept,))
396
438
 
401
443
            return None
402
444
 
403
445
    def _extract_line(self):
404
 
        pos = self._in_buffer.find('\n')
 
446
        in_buf = self._get_in_buffer()
 
447
        pos = in_buf.find('\n')
405
448
        if pos == -1:
406
449
            # We haven't read a complete line yet, so request more bytes before
407
450
            # we continue.
408
451
            raise _NeedMoreBytes(1)
409
 
        line = self._in_buffer[:pos]
 
452
        line = in_buf[:pos]
410
453
        # Trim the prefix (including '\n' delimiter) from the _in_buffer.
411
 
        self._in_buffer = self._in_buffer[pos+1:]
 
454
        self._set_in_buffer(in_buf[pos+1:])
412
455
        return line
413
456
 
414
457
    def _finished(self):
415
 
        self.unused_data = self._in_buffer
416
 
        self._in_buffer = ''
 
458
        self.unused_data = self._get_in_buffer()
 
459
        self._in_buffer_list = []
 
460
        self._in_buffer_len = 0
417
461
        self.state_accept = self._state_accept_reading_unused
418
462
        if self.error:
419
463
            error_args = tuple(self.error_in_progress)
448
492
            self.state_accept = self._state_accept_reading_chunk
449
493
 
450
494
    def _state_accept_reading_chunk(self):
451
 
        in_buffer_len = len(self._in_buffer)
452
 
        self.chunk_in_progress += self._in_buffer[:self.bytes_left]
453
 
        self._in_buffer = self._in_buffer[self.bytes_left:]
 
495
        in_buf = self._get_in_buffer()
 
496
        in_buffer_len = len(in_buf)
 
497
        self.chunk_in_progress += in_buf[:self.bytes_left]
 
498
        self._set_in_buffer(in_buf[self.bytes_left:])
454
499
        self.bytes_left -= in_buffer_len
455
500
        if self.bytes_left <= 0:
456
501
            # Finished with chunk
463
508
            self.state_accept = self._state_accept_expecting_length
464
509
        
465
510
    def _state_accept_reading_unused(self):
466
 
        self.unused_data += self._in_buffer
467
 
        self._in_buffer = ''
 
511
        self.unused_data += self._get_in_buffer()
 
512
        self._in_buffer_list = []
468
513
 
469
514
 
470
515
class LengthPrefixedBodyDecoder(_StatefulDecoder):
498
543
        return self.state_read()
499
544
 
500
545
    def _state_accept_expecting_length(self):
501
 
        pos = self._in_buffer.find('\n')
 
546
        in_buf = self._get_in_buffer()
 
547
        pos = in_buf.find('\n')
502
548
        if pos == -1:
503
549
            return
504
 
        self.bytes_left = int(self._in_buffer[:pos])
505
 
        self._in_buffer = self._in_buffer[pos+1:]
 
550
        self.bytes_left = int(in_buf[:pos])
 
551
        self._set_in_buffer(in_buf[pos+1:])
506
552
        self.state_accept = self._state_accept_reading_body
507
553
        self.state_read = self._state_read_body_buffer
508
554
 
509
555
    def _state_accept_reading_body(self):
510
 
        self._body += self._in_buffer
511
 
        self.bytes_left -= len(self._in_buffer)
512
 
        self._in_buffer = ''
 
556
        in_buf = self._get_in_buffer()
 
557
        self._body += in_buf
 
558
        self.bytes_left -= len(in_buf)
 
559
        self._set_in_buffer(None)
513
560
        if self.bytes_left <= 0:
514
561
            # Finished with body
515
562
            if self.bytes_left != 0:
519
566
            self.state_accept = self._state_accept_reading_trailer
520
567
        
521
568
    def _state_accept_reading_trailer(self):
522
 
        self._trailer_buffer += self._in_buffer
523
 
        self._in_buffer = ''
 
569
        self._trailer_buffer += self._get_in_buffer()
 
570
        self._set_in_buffer(None)
524
571
        # TODO: what if the trailer does not match "done\n"?  Should this raise
525
572
        # a ProtocolViolation exception?
526
573
        if self._trailer_buffer.startswith('done\n'):
529
576
            self.finished_reading = True
530
577
    
531
578
    def _state_accept_reading_unused(self):
532
 
        self.unused_data += self._in_buffer
533
 
        self._in_buffer = ''
 
579
        self.unused_data += self._get_in_buffer()
 
580
        self._set_in_buffer(None)
534
581
 
535
582
    def _state_read_no_data(self):
536
583
        return ''
865
912
            self.message_handler.protocol_error(exception)
866
913
 
867
914
    def _extract_length_prefixed_bytes(self):
868
 
        if len(self._in_buffer) < 4:
 
915
        if self._in_buffer_len < 4:
869
916
            # A length prefix by itself is 4 bytes, and we don't even have that
870
917
            # many yet.
871
918
            raise _NeedMoreBytes(4)
872
 
        (length,) = struct.unpack('!L', self._in_buffer[:4])
 
919
        (length,) = struct.unpack('!L', self._get_in_bytes(4))
873
920
        end_of_bytes = 4 + length
874
 
        if len(self._in_buffer) < end_of_bytes:
 
921
        if self._in_buffer_len < end_of_bytes:
875
922
            # We haven't yet read as many bytes as the length-prefix says there
876
923
            # are.
877
924
            raise _NeedMoreBytes(end_of_bytes)
878
925
        # Extract the bytes from the buffer.
879
 
        bytes = self._in_buffer[4:end_of_bytes]
880
 
        self._in_buffer = self._in_buffer[end_of_bytes:]
 
926
        in_buf = self._get_in_buffer()
 
927
        bytes = in_buf[4:end_of_bytes]
 
928
        self._set_in_buffer(in_buf[end_of_bytes:])
881
929
        return bytes
882
930
 
883
931
    def _extract_prefixed_bencoded_data(self):
890
938
        return decoded
891
939
 
892
940
    def _extract_single_byte(self):
893
 
        if self._in_buffer == '':
 
941
        if self._in_buffer_len == 0:
894
942
            # The buffer is empty
895
943
            raise _NeedMoreBytes(1)
896
 
        one_byte = self._in_buffer[0]
897
 
        self._in_buffer = self._in_buffer[1:]
 
944
        in_buf = self._get_in_buffer()
 
945
        one_byte = in_buf[0]
 
946
        self._set_in_buffer(in_buf[1:])
898
947
        return one_byte
899
948
 
900
949
    def _state_accept_expecting_protocol_version(self):
901
 
        needed_bytes = len(MESSAGE_VERSION_THREE) - len(self._in_buffer)
 
950
        needed_bytes = len(MESSAGE_VERSION_THREE) - self._in_buffer_len
 
951
        in_buf = self._get_in_buffer()
902
952
        if needed_bytes > 0:
903
953
            # We don't have enough bytes to check if the protocol version
904
954
            # marker is right.  But we can check if it is already wrong by
908
958
            # len(MESSAGE_VERSION_THREE) bytes.  So if the bytes we have so far
909
959
            # are wrong then we should just raise immediately rather than
910
960
            # stall.]
911
 
            if not MESSAGE_VERSION_THREE.startswith(self._in_buffer):
 
961
            if not MESSAGE_VERSION_THREE.startswith(in_buf):
912
962
                # We have enough bytes to know the protocol version is wrong
913
 
                raise errors.UnexpectedProtocolVersionMarker(self._in_buffer)
 
963
                raise errors.UnexpectedProtocolVersionMarker(in_buf)
914
964
            raise _NeedMoreBytes(len(MESSAGE_VERSION_THREE))
915
 
        if not self._in_buffer.startswith(MESSAGE_VERSION_THREE):
916
 
            raise errors.UnexpectedProtocolVersionMarker(self._in_buffer)
917
 
        self._in_buffer = self._in_buffer[len(MESSAGE_VERSION_THREE):]
 
965
        if not in_buf.startswith(MESSAGE_VERSION_THREE):
 
966
            raise errors.UnexpectedProtocolVersionMarker(in_buf)
 
967
        self._set_in_buffer(in_buf[len(MESSAGE_VERSION_THREE):])
918
968
        self.state_accept = self._state_accept_expecting_headers
919
969
 
920
970
    def _state_accept_expecting_headers(self):
969
1019
            raise errors.SmartMessageHandlerError(sys.exc_info())
970
1020
 
971
1021
    def done(self):
972
 
        self.unused_data = self._in_buffer
973
 
        self._in_buffer = ''
 
1022
        self.unused_data = self._get_in_buffer()
 
1023
        self._set_in_buffer(None)
974
1024
        self.state_accept = self._state_accept_reading_unused
975
1025
        try:
976
1026
            self.message_handler.end_received()
978
1028
            raise errors.SmartMessageHandlerError(sys.exc_info())
979
1029
 
980
1030
    def _state_accept_reading_unused(self):
981
 
        self.unused_data += self._in_buffer
982
 
        self._in_buffer = ''
 
1031
        self.unused_data = self._get_in_buffer()
 
1032
        self._set_in_buffer(None)
983
1033
 
984
1034
    def next_read_size(self):
985
1035
        if self.state_accept == self._state_accept_reading_unused:
992
1042
            return 0
993
1043
        else:
994
1044
            if self._number_needed_bytes is not None:
995
 
                return self._number_needed_bytes - len(self._in_buffer)
 
1045
                return self._number_needed_bytes - self._in_buffer_len
996
1046
            else:
997
1047
                raise AssertionError("don't know how many bytes are expected!")
998
1048