~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2009-01-24 18:50:51 UTC
  • mfrom: (3956.2.2 1.12-network-io)
  • Revision ID: pqm@pqm.ubuntu.com-20090124185051-8oryvqq68n6repso
(jam) Add Transport._report_activity support to HTTP transports.

Show diffs side-by-side

added added

removed removed

Lines of Context:
67
67
    # maximum size of read requests -- used to avoid MemoryError issues in recv
68
68
    _max_read_size = 512 * 1024
69
69
 
70
 
    def __init__(self, path, infile):
 
70
    def __init__(self, path, infile, report_activity=None):
71
71
        """Constructor.
72
72
 
73
73
        :param path: File url, for error reports.
74
74
        :param infile: File-like socket set at body start.
 
75
        :param report_activity: A Transport._report_activity function to call
 
76
            as bytes are read.
75
77
        """
76
78
        self._path = path
77
79
        self._file = infile
78
80
        self._boundary = None
 
81
        self._report_activity = report_activity
79
82
        # When using multi parts response, this will be set with the headers
80
83
        # associated with the range currently read.
81
84
        self._headers = None
228
231
            limited = self._start + self._size - self._pos
229
232
            if size >= 0:
230
233
                limited = min(limited, size)
231
 
        osutils.pumpfile(self._file, buffer, limited, self._max_read_size)
 
234
        osutils.pumpfile(self._file, buffer, limited, self._max_read_size,
 
235
            report_activity=self._report_activity, direction='read')
232
236
        data = buffer.getvalue()
233
237
 
234
238
        # Update _pos respecting the data effectively read
277
281
        return self._pos
278
282
 
279
283
 
280
 
def handle_response(url, code, msg, data):
 
284
def handle_response(url, code, msg, data, report_activity=None):
281
285
    """Interpret the code & headers and wrap the provided data in a RangeFile.
282
286
 
283
287
    This is a factory method which returns an appropriate RangeFile based on
291
295
    :return: A file-like object that can seek()+read() the 
292
296
             ranges indicated by the headers.
293
297
    """
294
 
    rfile = RangeFile(url, data)
 
298
    rfile = RangeFile(url, data, report_activity=report_activity)
295
299
    if code == 200:
296
300
        # A whole file
297
301
        size = msg.getheader('content-length', None)