Skip to content

Commit 7cc2e79

Browse files
author
Toby White
committed
Add support for passing a timeout through to the whois query
1 parent 7b0ddf7 commit 7cc2e79

File tree

2 files changed

+10
-9
lines changed

2 files changed

+10
-9
lines changed

pythonwhois/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from . import net, parse
22

3-
def get_whois(domain, normalized=[]):
4-
raw_data, server_list = net.get_whois_raw(domain, with_server_list=True)
3+
def get_whois(domain, normalized=[], timeout=None):
4+
raw_data, server_list = net.get_whois_raw(domain, with_server_list=True, timeout=None)
55
# Unlisted handles will be looked up on the last WHOIS server that was queried. This may be changed to also query
66
# other servers in the future, if it turns out that there are cases where the last WHOIS server in the chain doesn't
77
# actually hold the handle contact details, but another WHOIS server in the chain does.

pythonwhois/net.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from codecs import encode, decode
33
from . import shared
44

5-
def get_whois_raw(domain, server="", previous=None, rfc3490=True, never_cut=False, with_server_list=False, server_list=None):
5+
def get_whois_raw(domain, server="", previous=None, rfc3490=True, never_cut=False, with_server_list=False, server_list=None, timeout=None):
66
previous = previous or []
77
server_list = server_list or []
88
# 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
3030
target_server = exc_serv
3131
break
3232
if is_exception == False:
33-
target_server = get_root_server(domain)
33+
target_server = get_root_server(domain, timeout=timeout)
3434
else:
3535
target_server = server
3636
if target_server == "whois.jprs.jp":
@@ -41,7 +41,7 @@ def get_whois_raw(domain, server="", previous=None, rfc3490=True, never_cut=Fals
4141
request_domain = "=%s" % domain # Avoid partial matches
4242
else:
4343
request_domain = domain
44-
response = whois_request(request_domain, target_server)
44+
response = whois_request(request_domain, target_server, timeout=timeout)
4545
if never_cut:
4646
# If the caller has requested to 'never cut' responses, he will get the original response from the server (this is
4747
# useful for callers that are only interested in the raw data). Otherwise, if the target is verisign-grs, we will
@@ -66,24 +66,25 @@ def get_whois_raw(domain, server="", previous=None, rfc3490=True, never_cut=Fals
6666
referal_server = match.group(2)
6767
if referal_server != server and "://" not in referal_server: # We want to ignore anything non-WHOIS (eg. HTTP) for now.
6868
# Referal to another WHOIS server...
69-
return get_whois_raw(domain, referal_server, new_list, server_list=server_list, with_server_list=with_server_list)
69+
return get_whois_raw(domain, referal_server, new_list, server_list=server_list, with_server_list=with_server_list, timeout=timeout)
7070
if with_server_list:
7171
return (new_list, server_list)
7272
else:
7373
return new_list
7474

75-
def get_root_server(domain):
76-
data = whois_request(domain, "whois.iana.org")
75+
def get_root_server(domain, timeout=None):
76+
data = whois_request(domain, "whois.iana.org", timeout=timeout)
7777
for line in [x.strip() for x in data.splitlines()]:
7878
match = re.match("refer:\s*([^\s]+)", line)
7979
if match is None:
8080
continue
8181
return match.group(1)
8282
raise shared.WhoisException("No root WHOIS server found for domain.")
8383

84-
def whois_request(domain, server, port=43):
84+
def whois_request(domain, server, port=43, timeout=None):
8585
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
8686
sock.connect((server, port))
87+
sock.settimeout(timeout)
8788
sock.send(("%s\r\n" % domain).encode("utf-8"))
8889
buff = b""
8990
while True:

0 commit comments

Comments
 (0)