Mercurial > public > mercurial-scm > hg
comparison mercurial/statichttprepo.py @ 28883:032c4c2f802a
pycompat: switch to util.urlreq/util.urlerr for py3 compat
author | timeless <timeless@mozdev.org> |
---|---|
date | Wed, 06 Apr 2016 23:22:12 +0000 |
parents | 2380889f8f52 |
children | c1696430254f |
comparison
equal
deleted
inserted
replaced
28882:800ec7c048b0 | 28883:032c4c2f802a |
---|---|
9 | 9 |
10 from __future__ import absolute_import | 10 from __future__ import absolute_import |
11 | 11 |
12 import errno | 12 import errno |
13 import os | 13 import os |
14 import urllib | |
15 import urllib2 | |
16 | 14 |
17 from .i18n import _ | 15 from .i18n import _ |
18 from . import ( | 16 from . import ( |
19 byterange, | 17 byterange, |
20 changelog, | 18 changelog, |
25 scmutil, | 23 scmutil, |
26 store, | 24 store, |
27 url, | 25 url, |
28 util, | 26 util, |
29 ) | 27 ) |
28 | |
29 urlerr = util.urlerr | |
30 urlreq = util.urlreq | |
30 | 31 |
31 class httprangereader(object): | 32 class httprangereader(object): |
32 def __init__(self, url, opener): | 33 def __init__(self, url, opener): |
33 # we assume opener has HTTPRangeHandler | 34 # we assume opener has HTTPRangeHandler |
34 self.url = url | 35 self.url = url |
43 self.close() | 44 self.close() |
44 | 45 |
45 def seek(self, pos): | 46 def seek(self, pos): |
46 self.pos = pos | 47 self.pos = pos |
47 def read(self, bytes=None): | 48 def read(self, bytes=None): |
48 req = urllib2.Request(self.url) | 49 req = urlreq.request(self.url) |
49 end = '' | 50 end = '' |
50 if bytes: | 51 if bytes: |
51 end = self.pos + bytes - 1 | 52 end = self.pos + bytes - 1 |
52 if self.pos or end: | 53 if self.pos or end: |
53 req.add_header('Range', 'bytes=%d-%s' % (self.pos, end)) | 54 req.add_header('Range', 'bytes=%d-%s' % (self.pos, end)) |
54 | 55 |
55 try: | 56 try: |
56 f = self.opener.open(req) | 57 f = self.opener.open(req) |
57 data = f.read() | 58 data = f.read() |
58 code = f.code | 59 code = f.code |
59 except urllib2.HTTPError as inst: | 60 except urlerr.httperror as inst: |
60 num = inst.code == 404 and errno.ENOENT or None | 61 num = inst.code == 404 and errno.ENOENT or None |
61 raise IOError(num, inst) | 62 raise IOError(num, inst) |
62 except urllib2.URLError as inst: | 63 except urlerr.urlerror as inst: |
63 raise IOError(None, inst.reason[1]) | 64 raise IOError(None, inst.reason[1]) |
64 | 65 |
65 if code == 200: | 66 if code == 200: |
66 # HTTPRangeHandler does nothing if remote does not support | 67 # HTTPRangeHandler does nothing if remote does not support |
67 # Range headers and returns the full entity. Let's slice it. | 68 # Range headers and returns the full entity. Let's slice it. |
90 self.base = base | 91 self.base = base |
91 | 92 |
92 def __call__(self, path, mode='r', *args, **kw): | 93 def __call__(self, path, mode='r', *args, **kw): |
93 if mode not in ('r', 'rb'): | 94 if mode not in ('r', 'rb'): |
94 raise IOError('Permission denied') | 95 raise IOError('Permission denied') |
95 f = "/".join((self.base, urllib.quote(path))) | 96 f = "/".join((self.base, urlreq.quote(path))) |
96 return httprangereader(f, urlopener) | 97 return httprangereader(f, urlopener) |
97 | 98 |
98 def join(self, path): | 99 def join(self, path): |
99 if path: | 100 if path: |
100 return os.path.join(self.base, path) | 101 return os.path.join(self.base, path) |