Пример #1
0
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
Пример #2
0
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
Пример #3
0
 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
Пример #4
0
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
Пример #5
0
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
Пример #6
0
    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)
Пример #7
0
    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)
Пример #8
0
    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)
Пример #9
0
    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)