fixed builtin whois parser for pwhois.rotld.ro
authorRichard Baron Penman
Tue, 08 Jan 2013 16:04:19 +1100
changeset 6 7dee244ba3ef
parent 5 7ace7955a131
child 7 0c85f53b04cb
fixed builtin whois parser for pwhois.rotld.ro
pywhois/__init__.py
pywhois/parser.py
pywhois/whois.py
--- a/pywhois/__init__.py	Tue Jan 08 15:59:07 2013 +1100
+++ b/pywhois/__init__.py	Tue Jan 08 16:04:19 2013 +1100
@@ -9,6 +9,7 @@
     # clean domain to expose netloc
     domain = extract_domain(url)
     try:
+        raise OSError('')
         # try native whois command first
         r = subprocess.Popen(['whois', domain], stdout=subprocess.PIPE)
         text = r.stdout.read()
--- a/pywhois/parser.py	Tue Jan 08 15:59:07 2013 +1100
+++ b/pywhois/parser.py	Tue Jan 08 16:04:19 2013 +1100
@@ -53,7 +53,6 @@
     }
 
     def __init__(self, domain, text, regex=None):
-        print text
         self.domain = domain
         self.text = text
         if regex is not None:
--- a/pywhois/whois.py	Tue Jan 08 15:59:07 2013 +1100
+++ b/pywhois/whois.py	Tue Jan 08 16:04:19 2013 +1100
@@ -35,6 +35,18 @@
 import optparse
 #import pdb
 
+def enforce_ascii(a):
+    if isinstance(a, str) or isinstance(a, unicode):
+        # return a.encode('ascii', 'replace')
+        r = ""
+        for i in a:
+            if ord(i) >= 128:
+                r += "?"
+            else:
+                r += i
+        return r
+    else:
+        return a
 
 class NICClient(object) :
 
@@ -53,7 +65,7 @@
     BNICHOST            = "whois.registro.br"
     NORIDHOST           = "whois.norid.no"
     IANAHOST            = "whois.iana.org"
-    GERMNICHOST         = "de.whois-servers.net"
+    DENICHOST           = "de.whois-servers.net"
     DEFAULT_PORT        = "nicname"
     WHOIS_SERVER_ID     = "Whois Server:"
     WHOIS_ORG_SERVER_ID = "Registrant Street1:Whois Server:"
@@ -66,44 +78,65 @@
 
     def __init__(self) :
         self.use_qnichost = False
-        
+       
     def findwhois_server(self, buf, hostname):
         """Search the initial TLD lookup results for the regional-specifc
         whois server for getting contact details.
         """
+        #print 'finding whois server'
+        #print 'parameters:', buf, 'hostname', hostname
         nhost = None
         parts_index = 1
         start = buf.find(NICClient.WHOIS_SERVER_ID)
+        #print 'start', start
         if (start == -1):
             start = buf.find(NICClient.WHOIS_ORG_SERVER_ID)
             parts_index = 2
-        
-        if (start > -1):   
+       
+        if (start > -1):  
             end = buf[start:].find('\n')
+            #print 'end:', end
             whois_line = buf[start:end+start]
-            whois_parts = whois_line.split(':')
-            nhost = whois_parts[parts_index].strip()
+            #print 'whois_line', whois_line
+            nhost = whois_line.split(NICClient.WHOIS_SERVER_ID+' ').pop()
+            nhost = nhost.split('http://').pop()
+            #if the whois address is domain.tld/something then
+            #s.connect((hostname, 43)) does not work
+            if nhost.count('/') > 0:
+                nhost = None
+            #print 'nhost:',nhost
         elif (hostname == NICClient.ANICHOST):
             for nichost in NICClient.ip_whois:
                 if (buf.find(nichost) != -1):
                     nhost = nichost
                     break
         return nhost
-        
+       
     def whois(self, query, hostname, flags):
         """Perform initial lookup with TLD whois server
-        then, if the quick flag is false, search that result 
+        then, if the quick flag is false, search that result
         for the region-specifc whois server and do a lookup
         there for contact details
         """
+        #print 'Performing the whois'
+        #print 'parameters given:', query, hostname, flags
         #pdb.set_trace()
         s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
         s.connect((hostname, 43))
-        if (hostname == NICClient.GERMNICHOST):
-            s.send("-T dn,ace -C US-ASCII " + query + "\r\n")
+        """send takes bytes as an input
+        """
+        queryBytes = None
+        if (hostname == NICClient.DENICHOST):
+            #print 'the domain is in NIC DENIC'
+            queryBytes = ("-T dn,ace -C UTF-8 " + query + "\r\n").encode()
+            #print 'queryBytes:', queryBytes
         else:
-            s.send(query + "\r\n")
-        response = ''
+            queryBytes = (query  + "\r\n").encode()        
+        s.send(queryBytes)
+        """recv returns bytes
+        """
+        #print s
+        response = b''
         while True:
             d = s.recv(4096)
             response += d
@@ -112,12 +145,19 @@
         s.close()
         #pdb.set_trace()
         nhost = None
+        #print 'response', response
+        response = enforce_ascii(response)
         if (flags & NICClient.WHOIS_RECURSE and nhost == None):
-            nhost = self.findwhois_server(response, hostname)
+            #print 'Inside first if'
+            nhost = self.findwhois_server(response.decode(), hostname)
+            #print 'nhost is:', nhost
         if (nhost != None):
+            #print 'inside second if'
             response += self.whois(query, nhost, 0)
-        return response
-    
+            #print 'response', response
+        #print 'returning whois response'
+        return response.decode()
+   
     def choose_server(self, domain):
         """Choose initial lookup NIC host"""
         if (domain.endswith("-NORID")):
@@ -128,105 +168,108 @@
         tld = domain[pos+1:]
         if (tld[0].isdigit()):
             return NICClient.ANICHOST
-    
+   
         return tld + NICClient.QNICHOST_TAIL
-    
+   
     def whois_lookup(self, options, query_arg, flags):
-        """Main entry point: Perform initial lookup on TLD whois server, 
-        or other server to get region-specific whois server, then if quick 
-        flag is false, perform a second lookup on the region-specific 
+        """Main entry point: Perform initial lookup on TLD whois server,
+        or other server to get region-specific whois server, then if quick
+        flag is false, perform a second lookup on the region-specific
         server for contact records"""
+        #print 'whois_lookup'
         nichost = None
         #pdb.set_trace()
-        # this would be the case when this function is called by other then main
-        if (options == None):                     
+        # this would be the case when this function is called by other than main
+        if (options == None):                    
             options = {}
      
-        if ( (not options.has_key('whoishost') or options['whoishost'] == None)
-            and (not options.has_key('country') or options['country'] == None)):
+        if ( (not 'whoishost' in options or options['whoishost'] == None)
+            and (not 'country' in options or options['country'] == None)):
             self.use_qnichost = True
             options['whoishost'] = NICClient.NICHOST
             if ( not (flags & NICClient.WHOIS_QUICK)):
                 flags |= NICClient.WHOIS_RECURSE
-            
-        if (options.has_key('country') and options['country'] != None):
+           
+        if ('country' in options and options['country'] != None):
             result = self.whois(query_arg, options['country'] + NICClient.QNICHOST_TAIL, flags)
         elif (self.use_qnichost):
             nichost = self.choose_server(query_arg)
             if (nichost != None):
-                result = self.whois(query_arg, nichost, flags)           
+                result = self.whois(query_arg, nichost, flags)
         else:
             result = self.whois(query_arg, options['whoishost'], flags)
-            
+        #print 'whois_lookup finished'
         return result
 #---- END OF NICClient class def ---------------------
-    
+   
 def parse_command_line(argv):
     """Options handling mostly follows the UNIX whois(1) man page, except
     long-form options can also be used.
     """
     flags = 0
-    
+   
     usage = "usage: %prog [options] name"
-            
+           
     parser = optparse.OptionParser(add_help_option=False, usage=usage)
-    parser.add_option("-a", "--arin", action="store_const", 
+    parser.add_option("-a", "--arin", action="store_const",
                       const=NICClient.ANICHOST, dest="whoishost",
                       help="Lookup using host " + NICClient.ANICHOST)
-    parser.add_option("-A", "--apnic", action="store_const", 
+    parser.add_option("-A", "--apnic", action="store_const",
                       const=NICClient.PNICHOST, dest="whoishost",
                       help="Lookup using host " + NICClient.PNICHOST)
-    parser.add_option("-b", "--abuse", action="store_const", 
+    parser.add_option("-b", "--abuse", action="store_const",
                       const=NICClient.ABUSEHOST, dest="whoishost",
                       help="Lookup using host " + NICClient.ABUSEHOST)
-    parser.add_option("-c", "--country", action="store", 
+    parser.add_option("-c", "--country", action="store",
                       type="string", dest="country",
                       help="Lookup using country-specific NIC")
-    parser.add_option("-d", "--mil", action="store_const", 
+    parser.add_option("-d", "--mil", action="store_const",
                       const=NICClient.DNICHOST, dest="whoishost",
                       help="Lookup using host " + NICClient.DNICHOST)
-    parser.add_option("-g", "--gov", action="store_const", 
+    parser.add_option("-g", "--gov", action="store_const",
                       const=NICClient.GNICHOST, dest="whoishost",
                       help="Lookup using host " + NICClient.GNICHOST)
-    parser.add_option("-h", "--host", action="store", 
+    parser.add_option("-h", "--host", action="store",
                       type="string", dest="whoishost",
                        help="Lookup using specified whois host")
-    parser.add_option("-i", "--nws", action="store_const", 
+    parser.add_option("-i", "--nws", action="store_const",
                       const=NICClient.INICHOST, dest="whoishost",
                       help="Lookup using host " + NICClient.INICHOST)
-    parser.add_option("-I", "--iana", action="store_const", 
+    parser.add_option("-I", "--iana", action="store_const",
                       const=NICClient.IANAHOST, dest="whoishost",
                       help="Lookup using host " + NICClient.IANAHOST)
-    parser.add_option("-l", "--lcanic", action="store_const", 
+    parser.add_option("-l", "--lcanic", action="store_const",
                       const=NICClient.LNICHOST, dest="whoishost",
                       help="Lookup using host " + NICClient.LNICHOST)
-    parser.add_option("-m", "--ra", action="store_const", 
+    parser.add_option("-m", "--ra", action="store_const",
                       const=NICClient.MNICHOST, dest="whoishost",
                       help="Lookup using host " + NICClient.MNICHOST)
-    parser.add_option("-p", "--port", action="store", 
+    parser.add_option("-p", "--port", action="store",
                       type="int", dest="port",
                       help="Lookup using specified tcp port")
-    parser.add_option("-Q", "--quick", action="store_true", 
-                     dest="b_quicklookup", 
+    parser.add_option("-Q", "--quick", action="store_true",
+                     dest="b_quicklookup",
                      help="Perform quick lookup")
-    parser.add_option("-r", "--ripe", action="store_const", 
+    parser.add_option("-r", "--ripe", action="store_const",
                       const=NICClient.RNICHOST, dest="whoishost",
                       help="Lookup using host " + NICClient.RNICHOST)
-    parser.add_option("-R", "--ru", action="store_const", 
+    parser.add_option("-R", "--ru", action="store_const",
                       const="ru", dest="country",
                       help="Lookup Russian NIC")
-    parser.add_option("-6", "--6bone", action="store_const", 
+    parser.add_option("-6", "--6bone", action="store_const",
                       const=NICClient.SNICHOST, dest="whoishost",
                       help="Lookup using host " + NICClient.SNICHOST)
     parser.add_option("-?", "--help", action="help")
 
-        
+       
     return parser.parse_args(argv)
-    
+   
 if __name__ == "__main__":
     flags = 0
     nic_client = NICClient()
     (options, args) = parse_command_line(sys.argv)
     if (options.b_quicklookup is True):
         flags = flags|NICClient.WHOIS_QUICK
-    print nic_client.whois_lookup(options.__dict__, args[1], flags)
+    print(nic_client.whois_lookup(options.__dict__, args[1], flags))
+
+