diff --git a/eureka/client.py b/eureka/client.py index c0222ff..957fb38 100644 --- a/eureka/client.py +++ b/eureka/client.py @@ -1,13 +1,20 @@ import json import random -from urllib2 import URLError -from urlparse import urljoin + from eureka import requests from eureka import ec2metadata import logging import dns.resolver from eureka.requests import EurekaHTTPException +try: + # Python 3 and later + from urllib.error import URLError + from urllib.parse import urljoin +except ImportError: + # Python 2 + from urllib2 import URLError + from urlparse import urljoin logger = logging.getLogger('eureka.client') @@ -62,13 +69,15 @@ def __init__(self, app_name, eureka_url=None, eureka_domain_name=None, host_name # Relative URL to eureka self.context = context self.health_check_url = health_check_url + + def init(self): self.eureka_urls = self.get_eureka_urls() def _get_txt_records_from_dns(self, domain): records = dns.resolver.query(domain, 'TXT') for record in records: for string in record.strings: - yield string + yield string.decode("UTF-8") def _get_zone_urls_from_dns(self, domain): for zone in self._get_txt_records_from_dns(domain): diff --git a/eureka/ec2metadata.py b/eureka/ec2metadata.py index 9d4f807..085eb9e 100644 --- a/eureka/ec2metadata.py +++ b/eureka/ec2metadata.py @@ -39,7 +39,7 @@ def _test_connectivity(addr, port): s.connect((addr, port)) s.close() return True - except socket.error, e: + except socket.error as e: time.sleep(1) return False @@ -95,6 +95,6 @@ def display(metaopts, prefix=False): value = "unavailable" if prefix: - print "%s: %s" % (metaopt, value) + print("%s: %s" % (metaopt, value)) else: - print value + print(value) diff --git a/eureka/requests.py b/eureka/requests.py index 49bd53d..c5d9a60 100644 --- a/eureka/requests.py +++ b/eureka/requests.py @@ -1,14 +1,23 @@ -import urllib2 from eureka import __version__ as client_version import gzip -import StringIO +try: + # Python 3 and later + from urllib.request import Request as UrllibReq + from urllib.request import build_opener + from urllib.error import HTTPError + from io import StringIO +except ImportError: + # Python 2 + from urllib2 import Request as UrllibReq + from urllib2 import build_opener, HTTPError + import StringIO class EurekaHTTPException(Exception): pass -class Request(urllib2.Request): +class Request(UrllibReq): """ Instead of requiring a version of `requests`, we use this easy wrapper around urllib2 to avoud possible version conflicts with people own software. @@ -16,11 +25,11 @@ class Request(urllib2.Request): def __init__(self, url, method="GET", data=None, headers=None, origin_req_host=None, unverifiable=False): self.method = method - self._opener = urllib2.build_opener() + self._opener = build_opener() self._opener.addheaders = [ ('User-agent', 'python-eureka v%s' % client_version) ] - urllib2.Request.__init__(self, url, data=data, headers=headers or {}, + UrllibReq.__init__(self, url, data=data, headers=headers or {}, origin_req_host=origin_req_host, unverifiable=unverifiable) def get_method(self): @@ -32,7 +41,7 @@ def create(cls, method, url, data=None, headers=None): request = cls(url, method, data=data, headers=headers) try: response = request._opener.open(request) - except urllib2.HTTPError as e: + except HTTPError as e: return Response(e.code, e.read(), url, method) content = response.read() @@ -73,4 +82,4 @@ def put(url, data=None, headers=None): def delete(url, data=None, headers=None): - return Request.create("DELETE", url, data, headers) \ No newline at end of file + return Request.create("DELETE", url, data, headers)