def get_metainfo(fname, url, errorfunc): with WarningLock(lambda *args: errorfunc("warning: bad data in metafile")): if fname: try: metainfo = MetaInfo.read(fname) except (OSError, TypeError, KeyError, ValueError): errorfunc(fname + ' is not a valid metafile') return None else: try: with urlopen(url) as handle: metainfo = MetaInfo(bdecode(handle.read())) except IOError as e: errorfunc('problem getting response info - ' + str(e)) return None except (TypeError, KeyError, ValueError): errorfunc(fname + ' is not a valid metafile') return None try: check_info(metainfo.get('info')) except ValueError as e: errorfunc("got bad file info - " + str(e)) return None return metainfo
def get_metainfo(fname, url, errorfunc): with WarningLock(lambda *args: errorfunc("warning: bad data in metafile")): if fname: try: metainfo = MetaInfo.read(fname) except (OSError, TypeError, KeyError, ValueError): errorfunc(fname + ' is not a valid metafile') return None else: try: with urlopen(url) as handle: metainfo = MetaInfo(bdecode(handle.read())) except IOError as e: errorfunc('problem getting response info - ' + str(e)) return None except (TypeError, KeyError, ValueError): errorfunc(fname + ' is not a valid metafile') return None try: check_info(metainfo.get('info')) except ValueError as e: errorfunc("got bad file info - " + str(e)) return None return metainfo
def _aggregate_senddata(self, url): """just send, don't attempt to error check discard any returned data""" try: h = urlopen(url) h.read() h.close() except (IOError, socket.error): return
def get_response(file, url, errorfunc): try: if file: h = open(file, 'rb') try: # quick test to see if responsefile contains a dict line = h.read(10) front = line.split(':', 1)[0] assert front[0] == 'd' int(front[1:]) except (AssertionError, IOError): errorfunc(file + ' is not a valid responsefile') return None try: h.seek(0) except IOError: try: h.close() except IOError: pass h = open(file, 'rb') else: try: h = urlopen(url) except socket.error: errorfunc(url + ' bad url') return None response = h.read() except IOError as e: errorfunc('problem getting response info - ' + str(e)) return None try: h.close() except (IOError, socket.error): pass try: try: response = bdecode(response) except ValueError: errorfunc("warning: bad data in responsefile") response = bdecode(response, sloppy=1) check_type(response, dict) check_info(response.get('info')) check_type(response.get('announce'), str) except ValueError as e: errorfunc("got bad file info - " + str(e)) return None return response
def get_response(file, url, errorfunc): try: if file: h = open(file, 'rb') try: # quick test to see if responsefile contains a dict line = h.read(10) front = line.split(':', 1)[0] assert front[0] == 'd' int(front[1:]) except (AssertionError, IOError): errorfunc(file + ' is not a valid responsefile') return None try: h.seek(0) except IOError: try: h.close() except IOError: pass h = open(file, 'rb') else: try: h = urlopen(url) except socket.error: errorfunc(url + ' bad url') return None response = h.read() except IOError as e: errorfunc('problem getting response info - ' + str(e)) return None try: h.close() except (IOError, socket.error): pass try: try: response = bdecode(response) except ValueError: errorfunc("warning: bad data in responsefile") response = bdecode(response, sloppy=1) check_type(response, dict) check_info(response.get('info')) check_type(response.get('announce'), str) except ValueError as e: errorfunc("got bad file info - " + str(e)) return None return response
def _rerequest_single(self, t, s, l, callback): try: closer = [None] def timedout(self=self, l=l, closer=closer): if self.lock.trip(l): self.errorcodes['troublecode'] = 'Problem connecting to ' \ 'tracker - timeout exceeded' self.lock.unwait(l) try: closer[0]() except Exception: pass self.externalsched(timedout, self.timeout) err = None try: url, q = t.split('?', 1) q += '&' + s except ValueError: url = t q = s try: h = urlopen(url + '?' + q) closer[0] = h.close data = h.read() except (IOError, socket.error) as e: err = 'Problem connecting to tracker - ' + str(e) except Exception: err = 'Problem connecting to tracker' try: h.close() except socket.error: pass if err: if self.lock.trip(l): self.errorcodes['troublecode'] = err self.lock.unwait(l) return if data == '': if self.lock.trip(l): self.errorcodes['troublecode'] = 'no data from tracker' self.lock.unwait(l) return try: r = bdecode(data, sloppy=1) check_peers(r) except ValueError as e: if self.lock.trip(l): self.errorcodes['bad_data'] = 'bad data from tracker - ' \ + str(e) self.lock.unwait(l) return if 'failure reason' in r: if self.lock.trip(l): self.errorcodes['rejected'] = self.rejectedmessage + \ r['failure reason'] self.lock.unwait(l) return if self.lock.trip(l, True): # success! self.lock.unwait(l) else: # attempt timed out, don't do a callback callback = lambda: None # even if the attempt timed out, go ahead and process data def add(self=self, r=r, callback=callback): self.postrequest(r, callback) self.externalsched(add) except Exception: self.exception(callback)
def _rerequest_single(self, tracker, querystring, code, callback): try: closer = [None] def timedout(self=self, code=code, closer=closer): if self.lock.trip(code): self.errorcodes['troublecode'] = 'Problem connecting to ' \ 'tracker - timeout exceeded' self.lock.unwait(code) try: closer[0]() except Exception: pass self.sched(timedout, self.timeout) err = None if '?' in tracker: url, qstring = tracker.split('?', 1) querystring = qstring + '&' + querystring else: url = tracker try: with urlopen(url + '?' + querystring) as h: closer[0] = h.close data = h.read() except (IOError, socket.error) as e: err = 'Problem connecting to tracker - ' + str(e) except Exception: err = 'Problem connecting to tracker' if err: if self.lock.trip(code): self.errorcodes['troublecode'] = err self.lock.unwait(code) return if data == '': if self.lock.trip(code): self.errorcodes['troublecode'] = 'no data from tracker' self.lock.unwait(code) return try: response = Response(bdecode(data, sloppy=1)) check_peers(response) except ValueError as e: if self.lock.trip(code): self.errorcodes['bad_data'] = 'bad data from tracker - ' \ + str(e) self.lock.unwait(code) return if 'failure reason' in response: if self.lock.trip(code): self.errorcodes['rejected'] = self.rejectedmessage + \ response['failure reason'] self.lock.unwait(code) return if self.lock.trip(code, True): # success! self.lock.unwait(code) else: # attempt timed out, don't do a callback callback = lambda: None # even if the attempt timed out, go ahead and process data def add(self=self, response=response, callback=callback): self.postrequest(response, callback) self.sched(add) except Exception: self.exception(callback)
def _rerequest_single(self, tracker, querystring, code, callback): try: closer = [None] def timedout(self=self, code=code, closer=closer): if self.lock.trip(code): self.errorcodes['troublecode'] = 'Problem connecting to ' \ 'tracker - timeout exceeded' self.lock.unwait(code) try: closer[0]() except Exception: pass self.sched(timedout, self.timeout) err = None if '?' in tracker: url, qstring = tracker.split('?', 1) querystring = qstring + '&' + querystring else: url = tracker try: with urlopen(url + '?' + querystring) as h: closer[0] = h.close data = h.read() except (IOError, socket.error) as e: err = 'Problem connecting to tracker - ' + str(e) except Exception: err = 'Problem connecting to tracker' if err: if self.lock.trip(code): self.errorcodes['troublecode'] = err self.lock.unwait(code) return if data == '': if self.lock.trip(code): self.errorcodes['troublecode'] = 'no data from tracker' self.lock.unwait(code) return try: response = Response(bdecode(data, sloppy=1)) check_peers(response) except ValueError as e: if self.lock.trip(code): self.errorcodes['bad_data'] = 'bad data from tracker - ' \ + str(e) self.lock.unwait(code) return if 'failure reason' in response: if self.lock.trip(code): self.errorcodes['rejected'] = self.rejectedmessage + \ response['failure reason'] self.lock.unwait(code) return if self.lock.trip(code, True): # success! self.lock.unwait(code) else: # attempt timed out, don't do a callback callback = lambda: None # even if the attempt timed out, go ahead and process data def add(self=self, response=response, callback=callback): self.postrequest(response, callback) self.sched(add) except Exception: self.exception(callback)
def _rerequest_single(self, t, s, l, callback): try: closer = [None] def timedout(self=self, l=l, closer=closer): if self.lock.trip(l): self.errorcodes['troublecode'] = 'Problem connecting to ' \ 'tracker - timeout exceeded' self.lock.unwait(l) try: closer[0]() except Exception: pass self.externalsched(timedout, self.timeout) err = None try: url, q = t.split('?', 1) q += '&' + s except ValueError: url = t q = s try: h = urlopen(url + '?' + q) closer[0] = h.close data = h.read() except (IOError, socket.error) as e: err = 'Problem connecting to tracker - ' + str(e) except Exception: err = 'Problem connecting to tracker' try: h.close() except socket.error: pass if err: if self.lock.trip(l): self.errorcodes['troublecode'] = err self.lock.unwait(l) return if data == '': if self.lock.trip(l): self.errorcodes['troublecode'] = 'no data from tracker' self.lock.unwait(l) return try: r = bdecode(data, sloppy=1) check_peers(r) except ValueError as e: if self.lock.trip(l): self.errorcodes['bad_data'] = 'bad data from tracker - ' \ + str(e) self.lock.unwait(l) return if 'failure reason' in r: if self.lock.trip(l): self.errorcodes['rejected'] = self.rejectedmessage + \ r['failure reason'] self.lock.unwait(l) return if self.lock.trip(l, True): # success! self.lock.unwait(l) else: # attempt timed out, don't do a callback callback = lambda: None # even if the attempt timed out, go ahead and process data def add(self=self, r=r, callback=callback): self.postrequest(r, callback) self.externalsched(add) except Exception: self.exception(callback)