def get_handle(self):
"""
Returns a Curl handle ready to use for perform/multiperform.
"""
self.set_request_context(
self.p.url, self.p.get, self.p.post,
self.p.referer, self.p.cookies)
self.setopt(pycurl.WRITEFUNCTION, self.write_body)
self.setopt(pycurl.HEADERFUNCTION, self.write_header)
try:
self.fp.close()
except AttributeError:
pass
# request all bytes, since some servers in russia seems to have a
# defect arihmetic unit
filename = self.p.info.get_chunk_name(self.id)
if self.resume:
self.fp = lopen(filename, mode='ab')
self.arrived = self.fp.tell()
if not self.arrived:
self.arrived = os.stat(filename).st_size
if self.range:
# do nothing if chunk already finished
if self.arrived + self.range[0] >= self.range[1]:
return None
# as last chunk dont set end range, so we get everything
if self.id == len(self.p.info.chunks) - 1:
range = '{0:d}-'.format(self.arrived + self.range[0])
else:
range = '{0:d}-{1:d}'.format(
self.arrived + self.range[0],
min(self.range[1] + 1, self.p.size - 1))
self.log.debug("Chunked resume with range {0}".format(range))
self.setopt(pycurl.RANGE, range)
else:
self.log.debug("Resume File from {0:d}".format(self.arrived))
self.setopt(pycurl.RESUME_FROM, self.arrived)
else:
if self.range:
if self.id == len(self.p.info.chunks) - 1: # see above
range = "{0:d}-".format(self.range[0])
else:
range = "{0:d}-{1:d}".format(
self.range[0],
min(self.range[1] + 1, self.p.size - 1))
self.log.debug("Chunked with range {0}".format(range))
self.setopt(pycurl.RANGE, range)
self.fp = lopen(filename, mode='wb')
return self.c
评论列表
文章目录