~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/http.py

  • Committer: Jelmer Vernooij
  • Date: 2005-10-19 09:34:39 UTC
  • mfrom: (1185.16.78)
  • mto: (1185.16.102)
  • mto: This revision was merged to the branch mainline in revision 1488.
  • Revision ID: jelmer@samba.org-20051019093439-e1d8e3508d1ba46b
MergeĀ fromĀ Martin

Show diffs side-by-side

added added

removed removed

Lines of Context:
28
28
from bzrlib.branch import Branch
29
29
from bzrlib.trace import mutter
30
30
 
31
 
# velocitynet.com.au transparently proxies connections and thereby
32
 
# breaks keep-alive -- sucks!
33
 
 
34
31
 
35
32
def get_url(url):
36
33
    import urllib2
78
75
        This can be supplied with a string or a list
79
76
        """
80
77
        if isinstance(relpath, basestring):
81
 
            relpath = [relpath]
 
78
            relpath_parts = relpath.split('/')
 
79
        else:
 
80
            # TODO: Don't call this with an array - no magic interfaces
 
81
            relpath_parts = relpath[:]
 
82
        if len(relpath_parts) > 1:
 
83
            if relpath_parts[0] == '':
 
84
                raise ValueError("path %r within branch %r seems to be absolute"
 
85
                                 % (relpath, self._path))
 
86
            if relpath_parts[-1] == '':
 
87
                raise ValueError("path %r within branch %r seems to be a directory"
 
88
                                 % (relpath, self._path))
82
89
        basepath = self._path.split('/')
83
90
        if len(basepath) > 0 and basepath[-1] == '':
84
91
            basepath = basepath[:-1]
85
 
 
86
 
        for p in relpath:
 
92
        for p in relpath_parts:
87
93
            if p == '..':
88
 
                if len(basepath) < 0:
 
94
                if len(basepath) == 0:
89
95
                    # In most filesystems, a request for the parent
90
96
                    # of root, just returns root.
91
97
                    continue
92
 
                if len(basepath) > 0:
93
 
                    basepath.pop()
94
 
            elif p == '.':
 
98
                basepath.pop()
 
99
            elif p == '.' or p == '':
95
100
                continue # No-op
96
101
            else:
97
102
                basepath.append(p)
98
 
 
99
103
        # Possibly, we could use urlparse.urljoin() here, but
100
104
        # I'm concerned about when it chooses to strip the last
101
105
        # portion of the path, and when it doesn't.
103
107
        return urlparse.urlunparse((self._proto,
104
108
                self._host, path, '', '', ''))
105
109
 
106
 
    def relpath(self, abspath):
107
 
        if not abspath.startswith(self.base):
108
 
            raise NonRelativePath('path %r is not under base URL %r'
109
 
                           % (abspath, self.base))
110
 
        pl = len(self.base)
111
 
        return abspath[pl:].lstrip('/')
112
 
 
113
110
    def has(self, relpath):
114
111
        """Does the target location exist?
115
112
 
149
146
                             % (self.abspath(relpath), str(e)),
150
147
                             orig_error=e)
151
148
 
152
 
    def get_partial(self, relpath, start, length=None):
153
 
        """Get just part of a file.
154
 
 
155
 
        :param relpath: Path to the file, relative to base
156
 
        :param start: The starting position to read from
157
 
        :param length: The length to read. A length of None indicates
158
 
                       read to the end of the file.
159
 
        :return: A file-like object containing at least the specified bytes.
160
 
                 Some implementations may return objects which can be read
161
 
                 past this length, but this is not guaranteed.
162
 
        """
163
 
        # TODO: You can make specialized http requests for just
164
 
        # a portion of the file. Figure out how to do that.
165
 
        # For now, urllib2 returns files that cannot seek() so
166
 
        # we just read bytes off the beginning, until we
167
 
        # get to the point that we care about.
168
 
        f = self.get(relpath)
169
 
        # TODO: read in smaller chunks, in case things are
170
 
        # buffered internally.
171
 
        f.read(start)
172
 
        return f
173
 
 
174
149
    def put(self, relpath, f):
175
150
        """Copy the file-like or string object into the location.
176
151