def main():
    args = parse_command_line()

    if not args:
        args = ['localhost', 'www.google.com',
                'www.facebook.com', 'www.dropbox.com']

    resolvers = [Resolver(), ThreadedResolver()]

    if twisted is not None:
        from tornado.platform.twisted import TwistedResolver
        resolvers.append(TwistedResolver())

    if pycares is not None:
        from tornado.platform.caresresolver import CaresResolver
        resolvers.append(CaresResolver())

    family = {
        'unspec': socket.AF_UNSPEC,
        'inet': socket.AF_INET,
        'inet6': socket.AF_INET6,
    }[options.family]

    for host in args:
        print('Resolving %s' % host)
        for resolver in resolvers:
            addrinfo = yield resolver.resolve(host, 80, family)
            print('%s: %s' % (resolver.__class__.__name__,
                              pprint.pformat(addrinfo)))
        print()
    def __init__(self,
                 host,
                 port,
                 resolver=None,
                 http_client=None,
                 connect_timeout=0,
                 request_timeout=0,
                 **kwargs):
        self.host = host
        self.port = port
        self._connect_timeout = connect_timeout
        self._request_timeout = request_timeout

        self._http_client = http_client
        if not self._http_client:
            self._http_client = AsyncHTTPClient()

        self._resolver = resolver
        if not self._resolver:
            self._resolver = CaresResolver()
    def __init__(self, host, port,
                 resolver=None,
                 http_client=None,
                 connect_timeout=0,
                 request_timeout=0,
                 **kwargs):
        self.host = host
        self.port = port
        self._connect_timeout = connect_timeout
        self._request_timeout = request_timeout

        self._http_client = http_client
        if not self._http_client:
            self._http_client = AsyncHTTPClient()

        self._resolver = resolver
        if not self._resolver:
            self._resolver = CaresResolver()
Beispiel #4
0
 def setUp(self):
     super(CaresResolverTest, self).setUp()
     self.resolver = CaresResolver(io_loop=self.io_loop)
Beispiel #5
0
import unittest

from tornado.testing import AsyncTestCase, gen_test
from tornadowhois import AsyncWhoisClient
from tornado.platform.caresresolver import CaresResolver

resolver = CaresResolver()


class TornadoWhoisTest(AsyncTestCase):

    # @gen_test
    # def test_lookup(self):
    #     results = yield AsyncWhoisClient().lookup(AsyncWhoisClient.default_server)
    #
    #     self.assertEqual(len(results), 2)
    #
    #     for result in results:
    #         self.assertEqual(len(result), 2)
    #
    #     servers = ["whois.iana.org", "whois.pir.org"]
    #
    #     self.assertEqual(servers[0], results[0][0])
    #     self.assertEqual(servers[1], results[1][0])

    @gen_test
    def test_whois_query(self):
        result = yield AsyncWhoisClient(resolver).whois_query("google.com")
        self.assertGreater(len(result), 1)

Beispiel #6
0
 def setUp(self):
     super().setUp()
     self.resolver = CaresResolver()
Beispiel #7
0
 def setUp(self):
     super(CaresResolverTest, self).setUp()
     self.resolver = CaresResolver()
class DBApiDirect:
    """
        RESTApi к базе без кэша
    """

    # TODO: добавь суюда сахар aля get_palces get_cities
    def __init__(self,
                 host,
                 port,
                 resolver=None,
                 http_client=None,
                 connect_timeout=0,
                 request_timeout=0,
                 **kwargs):
        self.host = host
        self.port = port
        self._connect_timeout = connect_timeout
        self._request_timeout = request_timeout

        self._http_client = http_client
        if not self._http_client:
            self._http_client = AsyncHTTPClient()

        self._resolver = resolver
        if not self._resolver:
            self._resolver = CaresResolver()

    @gen.coroutine
    def _resolve(self, host, port):
        try:
            addresses = yield self._resolver.resolve(host, port)
            if not addresses:
                raise DBApiError('empty addresses list for %s:%s' %
                                 (host, port))
        except Exception as e:
            raise DBApiError(e)

        return choice(addresses)[1]  # noqa

    def _create_http_request(self,
                             method,
                             host,
                             port,
                             path,
                             params=None,
                             data=None,
                             **kwargs):

        url = 'http://{host}:{port}{uri}'.format(host=host,
                                                 port=port,
                                                 uri=path)

        if params and isinstance(params, dict):
            url += '?' + urlencode(params)

        request = HTTPRequest(method=method,
                              url=url,
                              allow_nonstandard_methods=True,
                              connect_timeout=self._connect_timeout,
                              request_timeout=self._request_timeout,
                              **kwargs)

        if data and method in ['POST', 'PUT', 'PATCH']:
            try:
                request.body = json.dumps(data)
            except TypeError as e:
                logging.error(str(e))
                raise DBApiError(e)

        return request

    def _check_request(self, request):
        if request.method not in ['GET', 'POST', 'PUT', 'PATCH', 'DELETE']:
            raise DBApiError('Disallowed method %s' % request.method)

    @staticmethod
    def _format_output(response):
        result = {}
        try:
            result = {
                'code': int(response.code),
                'headers': list(response.headers.get_all()),
                'data': {},
            }
            if response.body:
                result['data'] = json.loads(response.body.decode())
        except Exception as e:
            result = {
                'code': 400,
                'headers': [],
                'data': {
                    'message': str(e),
                },
            }
        return result

    @gen.coroutine
    def _request(self,
                 host,
                 port,
                 method,
                 path,
                 params=None,
                 data=None,
                 **kwargs):

        request = self._create_http_request(
            method,
            host,
            port,
            path,
            params=params,
            data=data,
            headers={'Content-Type': 'application/json; charset=UTF-8'},
            **kwargs)
        self._check_request(request)

        http_response = yield self._http_client.fetch(
            request,
            raise_error=False,
        )

        data = self._format_output(http_response)
        return data  # noqa

    @gen.coroutine
    def request(self, method, *args, **kwargs):
        try:
            host, port = yield self._resolve(self.host, self.port)

            result = yield self._request(host, port, method, *args, **kwargs)

        except DBApiError as e:
            return False, str(e)  # noqa

        except Exception as e:
            logging.error("error %s", str(e))
            raise

        return True, result  # noqa

    @gen.coroutine
    def get(self, *args, **kwargs):
        res = yield self.request('GET', *args, **kwargs)
        return res  # noqa

    @gen.coroutine
    def post(self, *args, **kwargs):
        res = yield self.request('POST', *args, **kwargs)
        return res  # noqa

    @gen.coroutine
    def put(self, *args, **kwargs):
        res = yield self.request('PUT', *args, **kwargs)
        return res  # noqa

    @gen.coroutine
    def patch(self, *args, **kwargs):
        res = yield self.request('PATCH', *args, **kwargs)
        return res  # noqa

    @gen.coroutine
    def delete(self, *args, **kwargs):
        res = yield self.request('DELETE', *args, **kwargs)
        return res  # noqa
class DBApiDirect:
    """
        RESTApi к базе без кэша
    """
    # TODO: добавь суюда сахар aля get_palces get_cities
    def __init__(self, host, port,
                 resolver=None,
                 http_client=None,
                 connect_timeout=0,
                 request_timeout=0,
                 **kwargs):
        self.host = host
        self.port = port
        self._connect_timeout = connect_timeout
        self._request_timeout = request_timeout

        self._http_client = http_client
        if not self._http_client:
            self._http_client = AsyncHTTPClient()

        self._resolver = resolver
        if not self._resolver:
            self._resolver = CaresResolver()

    @gen.coroutine
    def _resolve(self, host, port):
        try:
            addresses = yield self._resolver.resolve(host, port)
            if not addresses:
                raise DBApiError('empty addresses list for %s:%s' % (host, port))
        except Exception as e:
            raise DBApiError(e)

        return choice(addresses)[1]  # noqa

    def _create_http_request(self, method, host, port, path,
                             params=None, data=None, **kwargs):

        url = 'http://{host}:{port}{uri}'.format(host=host, port=port, uri=path)

        if params and isinstance(params, dict):
            url += '?' + urlencode(params)

        request = HTTPRequest(
            method=method,
            url=url,
            allow_nonstandard_methods=True,
            connect_timeout=self._connect_timeout,
            request_timeout=self._request_timeout,
            **kwargs
        )

        if data and method in ['POST', 'PUT', 'PATCH']:
            try:
                request.body = json.dumps(data)
            except TypeError as e:
                logging.error(str(e))
                raise DBApiError(e)

        return request

    def _check_request(self, request):
        if request.method not in ['GET', 'POST', 'PUT', 'PATCH', 'DELETE']:
            raise DBApiError('Disallowed method %s' % request.method)

    @staticmethod
    def _format_output(response):
        result = {}
        try:
            result = {
                'code': int(response.code),
                'headers': list(response.headers.get_all()),
                'data': {},
            }
            if response.body:
                result['data'] = json.loads(response.body.decode())
        except Exception as e:
            result = {
                'code': 400,
                'headers': [],
                'data': {
                    'message': str(e),
                },
            }
        return result

    @gen.coroutine
    def _request(self, host, port, method, path,
                 params=None, data=None, **kwargs):

        request = self._create_http_request(
            method,
            host,
            port,
            path,
            params=params,
            data=data,
            headers={'Content-Type': 'application/json; charset=UTF-8'},
            **kwargs
        )
        self._check_request(request)

        http_response = yield self._http_client.fetch(
            request,
            raise_error=False,
        )

        data = self._format_output(http_response)
        return data  # noqa

    @gen.coroutine
    def request(self, method, *args, **kwargs):
        try:
            host, port = yield self._resolve(self.host, self.port)

            result = yield self._request(host, port, method, *args, **kwargs)

        except DBApiError as e:
            return False, str(e)  # noqa

        except Exception as e:
            logging.error("error %s", str(e))
            raise

        return True, result  # noqa

    @gen.coroutine
    def get(self, *args, **kwargs):
        res = yield self.request('GET', *args, **kwargs)
        return res  # noqa

    @gen.coroutine
    def post(self, *args, **kwargs):
        res = yield self.request('POST', *args, **kwargs)
        return res  # noqa

    @gen.coroutine
    def put(self, *args, **kwargs):
        res = yield self.request('PUT', *args, **kwargs)
        return res  # noqa

    @gen.coroutine
    def patch(self, *args, **kwargs):
        res = yield self.request('PATCH', *args, **kwargs)
        return res  # noqa

    @gen.coroutine
    def delete(self, *args, **kwargs):
        res = yield self.request('DELETE', *args, **kwargs)
        return res  # noqa