22from codecs import encode , decode
33from . 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