~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

  • Committer: John Arbash Meinel
  • Date: 2006-06-17 15:52:51 UTC
  • mto: (1750.1.4 http)
  • mto: This revision was merged to the branch mainline in revision 1869.
  • Revision ID: john@arbash-meinel.com-20060617155251-c445c9574fcdf6aa
Move the common Multipart stuff into plain http, and wrap pycurl response so that it matches the urllib response object.

Show diffs side-by-side

added added

removed removed

Lines of Context:
52
52
        """Set the base path where files will be stored."""
53
53
        super(HttpTransport_urllib, self).__init__(base)
54
54
 
55
 
    def readv(self, relpath, offsets):
56
 
        """Get parts of the file at the given relative path.
57
 
 
58
 
        :param offsets: A list of (offset, size) tuples.
59
 
        :param return: A list or generator of (offset, data) tuples
60
 
        """
61
 
        mutter('readv of %s [%s]', relpath, offsets)
62
 
        ranges = self._offsets_to_ranges(offsets)
63
 
        code, f = self._get(relpath, ranges)
64
 
        for start, size in offsets:
65
 
            f.seek(start, 0)
66
 
            data = f.read(size)
67
 
            assert len(data) == size
68
 
            yield start, data
69
 
 
70
 
    def _is_multipart(self, content_type):
71
 
        return content_type.startswith('multipart/byteranges;')
72
 
 
73
 
    def _handle_response(self, path, response):
74
 
        """Interpret the code & headers and return a HTTP response.
75
 
 
76
 
        This is a factory method which returns an appropriate HTTP response
77
 
        based on the code & headers it's given.
78
 
        """
79
 
        content_type = response.headers['Content-Type']
80
 
        mutter('handling response code %s ctype %s', response.code,
81
 
            content_type)
82
 
 
83
 
        if response.code == 206 and self._is_multipart(content_type):
84
 
            # Full fledged multipart response
85
 
            return HttpMultipartRangeResponse(path, content_type, response)
86
 
        elif response.code == 206:
87
 
            # A response to a range request, but not multipart
88
 
            content_range = response.headers['Content-Range']
89
 
            return HttpRangeResponse(path, content_range, response)
90
 
        elif response.code == 200:
91
 
            # A regular non-range response, unfortunately the result from
92
 
            # urllib doesn't support seek, so we wrap it in a StringIO
93
 
            return StringIO(response.read())
94
 
        elif response.code == 404:
95
 
            raise NoSuchFile(path)
96
 
 
97
 
        raise BzrError("HTTP couldn't handle code %s", response.code)
98
 
 
99
55
    def _get(self, relpath, ranges):
100
56
        path = relpath
101
57
        try: