Rev 3958: Start using report_activity for HTTP (pycurl + urllib) in lp:///~jameinel/bzr/1.12-network-io
John Arbash Meinel
john at arbash-meinel.com
Fri Jan 23 21:22:47 GMT 2009
At lp:///~jameinel/bzr/1.12-network-io
------------------------------------------------------------
revno: 3958
revision-id: john at arbash-meinel.com-20090123212239-kbt36lwczrha6q67
parent: john at arbash-meinel.com-20090123212055-qsa1szqtrrxtwgdl
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: 1.12-network-io
timestamp: Fri 2009-01-23 15:22:39 -0600
message:
Start using report_activity for HTTP (pycurl + urllib)
-------------- next part --------------
=== modified file 'bzrlib/transport/http/__init__.py'
--- a/bzrlib/transport/http/__init__.py 2008-12-12 12:25:48 +0000
+++ b/bzrlib/transport/http/__init__.py 2009-01-23 21:22:39 +0000
@@ -123,13 +123,17 @@
:param relpath: The relative path to the file
"""
- code, response_file = self._get(relpath, None)
# FIXME: some callers want an iterable... One step forward, three steps
# backwards :-/ And not only an iterable, but an iterable that can be
# seeked backwards, so we will never be able to do that. One such
# known client is bzrlib.bundle.serializer.v4.get_bundle_reader. At the
# time of this writing it's even the only known client -- vila20071203
- return StringIO(response_file.read())
+ return StringIO(self.get_bytes(relpath))
+
+ def get_bytes(self, relpath):
+ """See Transport.get_bytes()."""
+ code, response_file = self._get(relpath, None)
+ return response_file.read()
def _get(self, relpath, ranges, tail_amount=0):
"""Get a file, or part of a file.
@@ -212,7 +216,6 @@
:param offsets: A list of (offset, size) tuples.
:param return: A list or generator of (offset, data) tuples
"""
-
# offsets may be a generator, we will iterate it several times, so
# build a list
offsets = list(offsets)
=== modified file 'bzrlib/transport/http/_pycurl.py'
--- a/bzrlib/transport/http/_pycurl.py 2008-12-12 14:33:13 +0000
+++ b/bzrlib/transport/http/_pycurl.py 2009-01-23 21:22:39 +0000
@@ -245,7 +245,8 @@
'Server return code %d'
% curl.getinfo(pycurl.HTTP_CODE))
msg = self._parse_headers(header)
- return code, response.handle_response(abspath, code, msg, data)
+ return code, response.handle_response(abspath, code, msg, data,
+ report_activity=self._report_activity)
def _parse_headers(self, status_and_headers):
"""Transform the headers provided by curl into an HTTPMessage"""
@@ -285,7 +286,9 @@
data.seek(0)
code = curl.getinfo(pycurl.HTTP_CODE)
msg = self._parse_headers(header)
- return code, response.handle_response(abspath, code, msg, data)
+ return code, response.handle_response(abspath, code, msg, data,
+ report_activity=self._report_activity)
+
def _raise_curl_http_error(self, curl, info=None):
code = curl.getinfo(pycurl.HTTP_CODE)
=== modified file 'bzrlib/transport/http/_urllib.py'
--- a/bzrlib/transport/http/_urllib.py 2008-12-12 14:33:13 +0000
+++ b/bzrlib/transport/http/_urllib.py 2009-01-23 21:22:39 +0000
@@ -126,7 +126,8 @@
raise errors.InvalidHttpRange(abspath, range_header,
'Server return code %d' % code)
- data = handle_response(abspath, code, response.info(), response)
+ data = handle_response(abspath, code, response.info(), response,
+ report_activity=self._report_activity)
return code, data
def _post(self, body_bytes):
@@ -136,7 +137,8 @@
response = self._perform(Request('POST', abspath, body_bytes,
accepted_errors=[200, 403]))
code = response.code
- data = handle_response(abspath, code, response.info(), response)
+ data = handle_response(abspath, code, response.info(), response,
+ report_activity=self._report_activity)
return code, data
def _head(self, relpath):
=== modified file 'bzrlib/transport/http/response.py'
--- a/bzrlib/transport/http/response.py 2008-07-15 13:11:53 +0000
+++ b/bzrlib/transport/http/response.py 2009-01-23 21:22:39 +0000
@@ -67,15 +67,18 @@
# maximum size of read requests -- used to avoid MemoryError issues in recv
_max_read_size = 512 * 1024
- def __init__(self, path, infile):
+ def __init__(self, path, infile, report_activity=None):
"""Constructor.
:param path: File url, for error reports.
:param infile: File-like socket set at body start.
+ :param report_activity: A Transport._report_activity function to call
+ as bytes are read.
"""
self._path = path
self._file = infile
self._boundary = None
+ self._report_activity = report_activity
# When using multi parts response, this will be set with the headers
# associated with the range currently read.
self._headers = None
@@ -228,7 +231,8 @@
limited = self._start + self._size - self._pos
if size >= 0:
limited = min(limited, size)
- osutils.pumpfile(self._file, buffer, limited, self._max_read_size)
+ osutils.pumpfile(self._file, buffer, limited, self._max_read_size,
+ report_activity=self._report_activity, direction='read')
data = buffer.getvalue()
# Update _pos respecting the data effectively read
@@ -277,7 +281,7 @@
return self._pos
-def handle_response(url, code, msg, data):
+def handle_response(url, code, msg, data, report_activity=None):
"""Interpret the code & headers and wrap the provided data in a RangeFile.
This is a factory method which returns an appropriate RangeFile based on
@@ -291,7 +295,7 @@
:return: A file-like object that can seek()+read() the
ranges indicated by the headers.
"""
- rfile = RangeFile(url, data)
+ rfile = RangeFile(url, data, report_activity=report_activity)
if code == 200:
# A whole file
size = msg.getheader('content-length', None)
More information about the bazaar-commits
mailing list