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