From 7cc2e79cb1d5435ae0c0bcb0d32f815fbc5ae26d Mon Sep 17 00:00:00 2001 From: Toby White Date: Fri, 22 Apr 2016 17:40:02 +0100 Subject: [PATCH] Add support for passing a timeout through to the whois query --- pythonwhois/__init__.py | 4 ++-- pythonwhois/net.py | 15 ++++++++------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/pythonwhois/__init__.py b/pythonwhois/__init__.py index 47639c3..643ceb7 100644 --- a/pythonwhois/__init__.py +++ b/pythonwhois/__init__.py @@ -1,7 +1,7 @@ from . import net, parse -def get_whois(domain, normalized=[]): - raw_data, server_list = net.get_whois_raw(domain, with_server_list=True) +def get_whois(domain, normalized=[], timeout=None): + raw_data, server_list = net.get_whois_raw(domain, with_server_list=True, timeout=None) # Unlisted handles will be looked up on the last WHOIS server that was queried. This may be changed to also query # other servers in the future, if it turns out that there are cases where the last WHOIS server in the chain doesn't # actually hold the handle contact details, but another WHOIS server in the chain does. diff --git a/pythonwhois/net.py b/pythonwhois/net.py index 53f87ba..be92dbb 100644 --- a/pythonwhois/net.py +++ b/pythonwhois/net.py @@ -2,7 +2,7 @@ from codecs import encode, decode from . import shared -def get_whois_raw(domain, server="", previous=None, rfc3490=True, never_cut=False, with_server_list=False, server_list=None): +def get_whois_raw(domain, server="", previous=None, rfc3490=True, never_cut=False, with_server_list=False, server_list=None, timeout=None): previous = previous or [] server_list = server_list or [] # Sometimes IANA simply won't give us the right root WHOIS server @@ -30,7 +30,7 @@ def get_whois_raw(domain, server="", previous=None, rfc3490=True, never_cut=Fals target_server = exc_serv break if is_exception == False: - target_server = get_root_server(domain) + target_server = get_root_server(domain, timeout=timeout) else: target_server = server if target_server == "whois.jprs.jp": @@ -41,7 +41,7 @@ def get_whois_raw(domain, server="", previous=None, rfc3490=True, never_cut=Fals request_domain = "=%s" % domain # Avoid partial matches else: request_domain = domain - response = whois_request(request_domain, target_server) + response = whois_request(request_domain, target_server, timeout=timeout) if never_cut: # If the caller has requested to 'never cut' responses, he will get the original response from the server (this is # useful for callers that are only interested in the raw data). Otherwise, if the target is verisign-grs, we will @@ -66,14 +66,14 @@ def get_whois_raw(domain, server="", previous=None, rfc3490=True, never_cut=Fals referal_server = match.group(2) if referal_server != server and "://" not in referal_server: # We want to ignore anything non-WHOIS (eg. HTTP) for now. # Referal to another WHOIS server... - return get_whois_raw(domain, referal_server, new_list, server_list=server_list, with_server_list=with_server_list) + return get_whois_raw(domain, referal_server, new_list, server_list=server_list, with_server_list=with_server_list, timeout=timeout) if with_server_list: return (new_list, server_list) else: return new_list -def get_root_server(domain): - data = whois_request(domain, "whois.iana.org") +def get_root_server(domain, timeout=None): + data = whois_request(domain, "whois.iana.org", timeout=timeout) for line in [x.strip() for x in data.splitlines()]: match = re.match("refer:\s*([^\s]+)", line) if match is None: @@ -81,9 +81,10 @@ def get_root_server(domain): return match.group(1) raise shared.WhoisException("No root WHOIS server found for domain.") -def whois_request(domain, server, port=43): +def whois_request(domain, server, port=43, timeout=None): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((server, port)) + sock.settimeout(timeout) sock.send(("%s\r\n" % domain).encode("utf-8")) buff = b"" while True: