~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/http/response.py

  • Committer: John Arbash Meinel
  • Date: 2008-05-28 21:53:46 UTC
  • mfrom: (3453 +trunk)
  • mto: This revision was merged to the branch mainline in revision 3458.
  • Revision ID: john@arbash-meinel.com-20080528215346-l8plys9h9ps624pn
merge bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
23
23
 
24
24
 
25
25
import httplib
 
26
from cStringIO import StringIO
26
27
 
27
28
from bzrlib import (
28
29
    errors,
29
30
    trace,
 
31
    osutils,
30
32
    )
31
33
 
32
34
 
61
63
    # 8k chunks should be fine.
62
64
    _discarded_buf_size = 8192
63
65
 
 
66
    # maximum size of read requests -- used to avoid MemoryError issues in recv
 
67
    _max_read_size = 512 * 1024
 
68
 
64
69
    def __init__(self, path, infile):
65
70
        """Constructor.
66
71
 
182
187
        client to clean the socket if we leave bytes unread. This may occur for
183
188
        the final boundary line of a multipart response or for any range
184
189
        request not entirely consumed by the client (due to offset coalescing)
 
190
 
 
191
        :param size:  The number of bytes to read.  Leave unspecified or pass
 
192
            -1 to read to EOF.
185
193
        """
186
194
        if (self._size > 0
187
195
            and self._pos == self._start + self._size):
201
209
                    "Can't read %s bytes across range (%s, %s)"
202
210
                    % (size, self._start, self._size))
203
211
 
 
212
        # read data from file
 
213
        buffer = StringIO()
 
214
        limited = size
204
215
        if self._size > 0:
205
216
            # Don't read past the range definition
206
217
            limited = self._start + self._size - self._pos
207
218
            if size >= 0:
208
219
                limited = min(limited, size)
209
 
            data = self._file.read(limited)
210
 
        else:
211
 
            # Size of file unknown, the user may have specified a size or not,
212
 
            # we delegate that to the filesocket object (-1 means read until
213
 
            # EOF)
214
 
            data = self._file.read(size)
 
220
        osutils.pumpfile(self._file, buffer, limited, self._max_read_size)
 
221
        data = buffer.getvalue()
 
222
 
215
223
        # Update _pos respecting the data effectively read
216
224
        self._pos += len(data)
217
225
        return data