~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/smart/medium.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2008-08-14 04:22:50 UTC
  • mfrom: (3606.4.1 hpss-http-bug)
  • Revision ID: pqm@pqm.ubuntu.com-20080814042250-v7qws60l3fjwelb1
(spiv) Fix a regression in bzr+http:// where http wasn't implementing
        a necessary function.

Show diffs side-by-side

added added

removed removed

Lines of Context:
80
80
    return protocol_factory, bytes
81
81
 
82
82
 
 
83
def _get_line(read_bytes_func):
 
84
    """Read bytes using read_bytes_func until a newline byte.
 
85
    
 
86
    This isn't particularly efficient, so should only be used when the
 
87
    expected size of the line is quite short.
 
88
    
 
89
    :returns: a tuple of two strs: (line, excess)
 
90
    """
 
91
    newline_pos = -1
 
92
    bytes = ''
 
93
    while newline_pos == -1:
 
94
        new_bytes = read_bytes_func(1)
 
95
        bytes += new_bytes
 
96
        if new_bytes == '':
 
97
            # Ran out of bytes before receiving a complete line.
 
98
            return bytes, ''
 
99
        newline_pos = bytes.find('\n')
 
100
    line = bytes[:newline_pos+1]
 
101
    excess = bytes[newline_pos+1:]
 
102
    return line, excess
 
103
 
 
104
 
83
105
class SmartMedium(object):
84
106
    """Base class for smart protocol media, both client- and server-side."""
85
107
 
131
153
 
132
154
        :returns: a string of bytes ending in a newline (byte 0x0A).
133
155
        """
134
 
        newline_pos = -1
135
 
        bytes = ''
136
 
        while newline_pos == -1:
137
 
            new_bytes = self.read_bytes(1)
138
 
            bytes += new_bytes
139
 
            if new_bytes == '':
140
 
                # Ran out of bytes before receiving a complete line.
141
 
                return bytes
142
 
            newline_pos = bytes.find('\n')
143
 
        line = bytes[:newline_pos+1]
144
 
        self._push_back(bytes[newline_pos+1:])
 
156
        line, excess = _get_line(self.read_bytes)
 
157
        self._push_back(excess)
145
158
        return line
146
159
 
147
160
 
438
451
        return self._medium.read_bytes(count)
439
452
 
440
453
    def read_line(self):
441
 
        line = self._medium._get_line()
 
454
        line = self._read_line()
442
455
        if not line.endswith('\n'):
443
456
            # end of file encountered reading from server
444
457
            raise errors.ConnectionReset(
446
459
                "(and try -Dhpss if further diagnosis is required)")
447
460
        return line
448
461
 
 
462
    def _read_line(self):
 
463
        """Helper for SmartClientMediumRequest.read_line.
 
464
        
 
465
        By default this forwards to self._medium._get_line because we are
 
466
        operating on the medium's stream.
 
467
        """
 
468
        return self._medium._get_line()
 
469
 
449
470
 
450
471
class SmartClientMedium(SmartMedium):
451
472
    """Smart client is a medium for sending smart protocol requests over."""