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
@@ -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