Skip to content

Commit d4cec15

Browse files
author
Ángel González
committed
Merge timeout support by tow
Closes: joepie91#117
2 parents 7af056a + 7cc2e79 commit d4cec15

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
@@ -43,7 +43,7 @@ def get_whois_raw(domain, server="", previous=None, rfc3490=True, never_cut=Fals
4343
target_server = exc_serv
4444
break
4545
if is_exception == False:
46-
target_server = get_root_server(domain)
46+
target_server = get_root_server(domain, timeout=timeout)
4747
else:
4848
target_server = server
4949
if target_server == "whois.jprs.jp":
@@ -54,7 +54,7 @@ def get_whois_raw(domain, server="", previous=None, rfc3490=True, never_cut=Fals
5454
request_domain = "=%s" % domain # Avoid partial matches
5555
else:
5656
request_domain = domain
57-
response = whois_request(request_domain, target_server)
57+
response = whois_request(request_domain, target_server, timeout=timeout)
5858
if never_cut:
5959
# If the caller has requested to 'never cut' responses, he will get the original response from the server (this is
6060
# useful for callers that are only interested in the raw data). Otherwise, if the target is verisign-grs, we will
@@ -82,25 +82,26 @@ def get_whois_raw(domain, server="", previous=None, rfc3490=True, never_cut=Fals
8282
referal_server = match.group(2)
8383
if referal_server != server and "://" not in referal_server: # We want to ignore anything non-WHOIS (eg. HTTP) for now.
8484
# Referal to another WHOIS server...
85-
return get_whois_raw(domain, referal_server, new_list, server_list=server_list, with_server_list=with_server_list)
85+
return get_whois_raw(domain, referal_server, new_list, server_list=server_list, with_server_list=with_server_list, timeout=timeout)
8686

8787
if with_server_list:
8888
return (new_list, server_list)
8989
else:
9090
return new_list
9191

92-
def get_root_server(domain):
93-
data = whois_request(domain, "whois.iana.org")
92+
def get_root_server(domain, timeout=None):
93+
data = whois_request(domain, "whois.iana.org", timeout=timeout)
9494
for line in [x.strip() for x in data.splitlines()]:
9595
match = re.match("refer:\s*([^\s]+)", line)
9696
if match is None:
9797
continue
9898
return match.group(1)
9999
raise shared.WhoisException("No root WHOIS server found for domain.")
100100

101-
def whois_request(domain, server, port=43):
101+
def whois_request(domain, server, port=43, timeout=None):
102102
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
103103
sock.connect((server, port))
104+
sock.settimeout(timeout)
104105
sock.send(("%s\r\n" % domain).encode("utf-8"))
105106
buff = b""
106107
while True:

0 commit comments

Comments
 (0)