whois 1.2.2 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (429) hide show
  1. data/CHANGELOG.rdoc +23 -0
  2. data/README.rdoc +24 -7
  3. data/lib/core_ext.rb +4 -3
  4. data/lib/whois/answer/contact.rb +1 -1
  5. data/lib/whois/answer/nameserver.rb +41 -0
  6. data/lib/whois/answer/parser/base.rb +1 -0
  7. data/lib/whois/answer/parser/jobswhois.verisign-grs.com.rb +2 -2
  8. data/lib/whois/answer/parser/scanners/iana.rb +145 -0
  9. data/lib/whois/answer/parser/scanners/verisign.rb +15 -15
  10. data/lib/whois/answer/parser/whois.crsnic.net.rb +2 -2
  11. data/lib/whois/answer/parser/whois.denic.de.rb +27 -22
  12. data/lib/whois/answer/parser/whois.iana.org.rb +56 -16
  13. data/lib/whois/answer/parser/whois.nic.cc.rb +1 -1
  14. data/lib/whois/answer/parser/whois.nic.hu.rb +12 -8
  15. data/lib/whois/answer/parser/whois.nic.it.rb +1 -1
  16. data/lib/whois/answer/parser/whois.nic.tv.rb +1 -1
  17. data/lib/whois/answer/parser/whois.publicinterestregistry.net.rb +11 -9
  18. data/lib/whois/answer/registrar.rb +5 -5
  19. data/lib/whois/client.rb +0 -1
  20. data/lib/whois/errors.rb +19 -19
  21. data/lib/whois/server.rb +119 -47
  22. data/lib/whois/server/adapters/base.rb +44 -2
  23. data/lib/whois/version.rb +4 -3
  24. data/whois.gemspec +9 -18
  25. metadata +26 -713
  26. data/Manifest +0 -541
  27. data/Rakefile +0 -82
  28. data/data/ip6_del_list +0 -47
  29. data/data/ip_del_list +0 -245
  30. data/data/make_ip6_del.pl +0 -38
  31. data/data/make_ip_del.pl +0 -25
  32. data/data/make_servers_charset.pl +0 -21
  33. data/data/make_tld_serv.pl +0 -23
  34. data/data/servers_charset_list +0 -38
  35. data/data/tld_serv_list +0 -377
  36. data/tasks/server.rake +0 -109
  37. data/test/list_tld +0 -324
  38. data/test/test_helper.rb +0 -56
  39. data/test/testcases/referrals/afilias.bz.txt +0 -40
  40. data/test/testcases/referrals/crsnic.com.txt +0 -210
  41. data/test/testcases/referrals/crsnic.com_more_servers.txt +0 -210
  42. data/test/testcases/referrals/crsnic.com_one_server.txt +0 -57
  43. data/test/testcases/referrals/niccc.cc.txt +0 -59
  44. data/test/testcases/referrals/pir.org.txt +0 -84
  45. data/test/testcases/responses/UTF8.txt +0 -10
  46. data/test/testcases/responses/jobswhois.verisign-grs.com/available.txt +0 -44
  47. data/test/testcases/responses/jobswhois.verisign-grs.com/property_registrar.txt +0 -54
  48. data/test/testcases/responses/jobswhois.verisign-grs.com/registered.txt +0 -54
  49. data/test/testcases/responses/whois.adamsnames.tc/gd/available.txt +0 -2
  50. data/test/testcases/responses/whois.adamsnames.tc/gd/registered.txt +0 -26
  51. data/test/testcases/responses/whois.adamsnames.tc/tc/available.txt +0 -2
  52. data/test/testcases/responses/whois.adamsnames.tc/tc/registered.txt +0 -28
  53. data/test/testcases/responses/whois.adamsnames.tc/vg/available.txt +0 -2
  54. data/test/testcases/responses/whois.adamsnames.tc/vg/registered.txt +0 -28
  55. data/test/testcases/responses/whois.aeda.net.ae/available.txt +0 -1
  56. data/test/testcases/responses/whois.aeda.net.ae/registered.txt +0 -15
  57. data/test/testcases/responses/whois.aero/available.txt +0 -1
  58. data/test/testcases/responses/whois.aero/registered.txt +0 -102
  59. data/test/testcases/responses/whois.afilias-grs.info/bz/available.txt +0 -1
  60. data/test/testcases/responses/whois.afilias-grs.info/bz/registered.txt +0 -122
  61. data/test/testcases/responses/whois.afilias-grs.info/gi/available.txt +0 -1
  62. data/test/testcases/responses/whois.afilias-grs.info/gi/registered.txt +0 -98
  63. data/test/testcases/responses/whois.afilias-grs.info/hn/available.txt +0 -1
  64. data/test/testcases/responses/whois.afilias-grs.info/hn/registered.txt +0 -85
  65. data/test/testcases/responses/whois.afilias-grs.info/lc/available.txt +0 -1
  66. data/test/testcases/responses/whois.afilias-grs.info/lc/registered.txt +0 -83
  67. data/test/testcases/responses/whois.afilias-grs.info/mn/available.txt +0 -1
  68. data/test/testcases/responses/whois.afilias-grs.info/mn/registered.txt +0 -100
  69. data/test/testcases/responses/whois.afilias-grs.info/sc/available.txt +0 -1
  70. data/test/testcases/responses/whois.afilias-grs.info/sc/registered.txt +0 -85
  71. data/test/testcases/responses/whois.afilias-grs.info/vc/available.txt +0 -1
  72. data/test/testcases/responses/whois.afilias-grs.info/vc/registered.txt +0 -100
  73. data/test/testcases/responses/whois.afilias.info/available.txt +0 -1
  74. data/test/testcases/responses/whois.afilias.info/registered.txt +0 -104
  75. data/test/testcases/responses/whois.ai/available.txt +0 -2
  76. data/test/testcases/responses/whois.ai/registered.txt +0 -59
  77. data/test/testcases/responses/whois.arnes.si/available.txt +0 -29
  78. data/test/testcases/responses/whois.arnes.si/registered.txt +0 -55
  79. data/test/testcases/responses/whois.audns.net.au/available.txt +0 -1
  80. data/test/testcases/responses/whois.audns.net.au/registered.txt +0 -23
  81. data/test/testcases/responses/whois.biz/available.txt +0 -25
  82. data/test/testcases/responses/whois.biz/registered.txt +0 -89
  83. data/test/testcases/responses/whois.cat/available.txt +0 -18
  84. data/test/testcases/responses/whois.cat/registered.txt +0 -83
  85. data/test/testcases/responses/whois.cctld.uz/available.txt +0 -12
  86. data/test/testcases/responses/whois.cctld.uz/registered.txt +0 -123
  87. data/test/testcases/responses/whois.cira.ca/available.txt +0 -9
  88. data/test/testcases/responses/whois.cira.ca/registered.txt +0 -47
  89. data/test/testcases/responses/whois.cnnic.cn/available.txt +0 -1
  90. data/test/testcases/responses/whois.cnnic.cn/registered.txt +0 -19
  91. data/test/testcases/responses/whois.crsnic.net/MULTIPLE.txt +0 -3
  92. data/test/testcases/responses/whois.crsnic.net/available.txt +0 -43
  93. data/test/testcases/responses/whois.crsnic.net/nameservers_with_no_nameserver.txt +0 -67
  94. data/test/testcases/responses/whois.crsnic.net/registered.txt +0 -57
  95. data/test/testcases/responses/whois.crsnic.net/registered_with_multiple_entries.txt +0 -235
  96. data/test/testcases/responses/whois.denic.de/1-10-0_available.txt +0 -30
  97. data/test/testcases/responses/whois.denic.de/1-10-0_registered.txt +0 -77
  98. data/test/testcases/responses/whois.denic.de/available.txt +0 -42
  99. data/test/testcases/responses/whois.denic.de/error_invalid_domain_name.txt +0 -37
  100. data/test/testcases/responses/whois.denic.de/property_nameservers_with_ip.txt +0 -67
  101. data/test/testcases/responses/whois.denic.de/property_technical_contact.txt +0 -70
  102. data/test/testcases/responses/whois.denic.de/registered.txt +0 -70
  103. data/test/testcases/responses/whois.dk-hostmaster.dk/available.txt +0 -15
  104. data/test/testcases/responses/whois.dk-hostmaster.dk/registered.txt +0 -47
  105. data/test/testcases/responses/whois.dns.be/available.txt +0 -41
  106. data/test/testcases/responses/whois.dns.be/registered.txt +0 -66
  107. data/test/testcases/responses/whois.dns.lu/available.txt +0 -26
  108. data/test/testcases/responses/whois.dns.lu/property_nameservers_with_ip.txt +0 -55
  109. data/test/testcases/responses/whois.dns.lu/registered.txt +0 -57
  110. data/test/testcases/responses/whois.dns.pt/available.txt +0 -1
  111. data/test/testcases/responses/whois.dns.pt/registered.txt +0 -32
  112. data/test/testcases/responses/whois.domain-registry.nl/available.txt +0 -21
  113. data/test/testcases/responses/whois.domain-registry.nl/registered.txt +0 -67
  114. data/test/testcases/responses/whois.domainregistry.ie/available.txt +0 -7
  115. data/test/testcases/responses/whois.domainregistry.ie/registered.txt +0 -26
  116. data/test/testcases/responses/whois.domreg.lt/available.txt +0 -18
  117. data/test/testcases/responses/whois.domreg.lt/property_nameservers_with_ip.txt +0 -32
  118. data/test/testcases/responses/whois.domreg.lt/registered.txt +0 -37
  119. data/test/testcases/responses/whois.dot.tk/available.txt +0 -1
  120. data/test/testcases/responses/whois.dot.tk/registered.txt +0 -28
  121. data/test/testcases/responses/whois.dotmobiregistry.net/available.txt +0 -25
  122. data/test/testcases/responses/whois.dotmobiregistry.net/registered.txt +0 -81
  123. data/test/testcases/responses/whois.educause.edu/available.txt +0 -28
  124. data/test/testcases/responses/whois.educause.edu/registered.txt +0 -66
  125. data/test/testcases/responses/whois.eenet.ee/available.txt +0 -6
  126. data/test/testcases/responses/whois.eenet.ee/registered.txt +0 -27
  127. data/test/testcases/responses/whois.eu.org/available.txt +0 -1
  128. data/test/testcases/responses/whois.eu.org/registered.txt +0 -19
  129. data/test/testcases/responses/whois.eu/available.txt +0 -47
  130. data/test/testcases/responses/whois.eu/property_nameservers_with_ip.txt +0 -61
  131. data/test/testcases/responses/whois.eu/registered.txt +0 -63
  132. data/test/testcases/responses/whois.hkdnr.net.hk/available.txt +0 -1
  133. data/test/testcases/responses/whois.hkdnr.net.hk/registered.txt +0 -96
  134. data/test/testcases/responses/whois.iana.org/MULTIPLE.txt +0 -3
  135. data/test/testcases/responses/whois.iana.org/available.txt +0 -7
  136. data/test/testcases/responses/whois.iana.org/registered.txt +0 -89
  137. data/test/testcases/responses/whois.in.ua/available.txt +0 -4
  138. data/test/testcases/responses/whois.in.ua/registered.txt +0 -16
  139. data/test/testcases/responses/whois.isnic.is/available.txt +0 -7
  140. data/test/testcases/responses/whois.isnic.is/registered.txt +0 -57
  141. data/test/testcases/responses/whois.jprs.jp/jp/available.txt +0 -17
  142. data/test/testcases/responses/whois.jprs.jp/jp/registered.txt +0 -30
  143. data/test/testcases/responses/whois.jprs.jp/ne.jp/available.txt +0 -17
  144. data/test/testcases/responses/whois.jprs.jp/ne.jp/registered.txt +0 -19
  145. data/test/testcases/responses/whois.meregistry.net/available.txt +0 -1
  146. data/test/testcases/responses/whois.meregistry.net/registered.txt +0 -94
  147. data/test/testcases/responses/whois.museum/available.txt +0 -18
  148. data/test/testcases/responses/whois.museum/registered.txt +0 -92
  149. data/test/testcases/responses/whois.net.ua/available.txt +0 -7
  150. data/test/testcases/responses/whois.net.ua/property_nameservers_uppercase.txt +0 -29
  151. data/test/testcases/responses/whois.net.ua/redirect_to_whois.in.ua.txt +0 -29
  152. data/test/testcases/responses/whois.net.ua/registered.txt +0 -58
  153. data/test/testcases/responses/whois.nic-se.se/available.txt +0 -21
  154. data/test/testcases/responses/whois.nic-se.se/property_nameservers_with_ip.txt +0 -37
  155. data/test/testcases/responses/whois.nic-se.se/registered.txt +0 -37
  156. data/test/testcases/responses/whois.nic.ac/available.txt +0 -2
  157. data/test/testcases/responses/whois.nic.ac/registered.txt +0 -2
  158. data/test/testcases/responses/whois.nic.af/available.txt +0 -13
  159. data/test/testcases/responses/whois.nic.af/registered.txt +0 -56
  160. data/test/testcases/responses/whois.nic.ag/available.txt +0 -1
  161. data/test/testcases/responses/whois.nic.ag/registered.txt +0 -100
  162. data/test/testcases/responses/whois.nic.am/available.txt +0 -3
  163. data/test/testcases/responses/whois.nic.am/registered.txt +0 -42
  164. data/test/testcases/responses/whois.nic.as/available.txt +0 -12
  165. data/test/testcases/responses/whois.nic.as/registered.txt +0 -18
  166. data/test/testcases/responses/whois.nic.asia/available.txt +0 -1
  167. data/test/testcases/responses/whois.nic.asia/registered.txt +0 -159
  168. data/test/testcases/responses/whois.nic.at/available.txt +0 -25
  169. data/test/testcases/responses/whois.nic.at/registered.txt +0 -65
  170. data/test/testcases/responses/whois.nic.cc/available.txt +0 -44
  171. data/test/testcases/responses/whois.nic.cc/registered.txt +0 -58
  172. data/test/testcases/responses/whois.nic.cd/available.txt +0 -1
  173. data/test/testcases/responses/whois.nic.cd/registered.txt +0 -85
  174. data/test/testcases/responses/whois.nic.ch/available.txt +0 -2
  175. data/test/testcases/responses/whois.nic.ch/property_nameservers_with_ip.txt +0 -27
  176. data/test/testcases/responses/whois.nic.ch/registered.txt +0 -28
  177. data/test/testcases/responses/whois.nic.co/available.txt +0 -28
  178. data/test/testcases/responses/whois.nic.co/registered.txt +0 -82
  179. data/test/testcases/responses/whois.nic.coop/available.txt +0 -33
  180. data/test/testcases/responses/whois.nic.coop/registered.txt +0 -123
  181. data/test/testcases/responses/whois.nic.ec/available.txt +0 -1
  182. data/test/testcases/responses/whois.nic.ec/registered.txt +0 -40
  183. data/test/testcases/responses/whois.nic.fr/fr/available.txt +0 -19
  184. data/test/testcases/responses/whois.nic.fr/fr/registered.txt +0 -98
  185. data/test/testcases/responses/whois.nic.fr/pm/available.txt +0 -19
  186. data/test/testcases/responses/whois.nic.fr/pm/registered.txt +0 -88
  187. data/test/testcases/responses/whois.nic.fr/re/available.txt +0 -19
  188. data/test/testcases/responses/whois.nic.fr/re/registered.txt +0 -83
  189. data/test/testcases/responses/whois.nic.fr/wf/available.txt +0 -19
  190. data/test/testcases/responses/whois.nic.fr/wf/registered.txt +0 -88
  191. data/test/testcases/responses/whois.nic.fr/yt/available.txt +0 -19
  192. data/test/testcases/responses/whois.nic.fr/yt/registered.txt +0 -88
  193. data/test/testcases/responses/whois.nic.gl/available.txt +0 -23
  194. data/test/testcases/responses/whois.nic.gl/registered.txt +0 -40
  195. data/test/testcases/responses/whois.nic.gov/available.txt +0 -1
  196. data/test/testcases/responses/whois.nic.gov/registered.txt +0 -5
  197. data/test/testcases/responses/whois.nic.ht/available.txt +0 -23
  198. data/test/testcases/responses/whois.nic.ht/registered.txt +0 -59
  199. data/test/testcases/responses/whois.nic.hu/current/available.txt +0 -3
  200. data/test/testcases/responses/whois.nic.hu/current/registered.txt +0 -9
  201. data/test/testcases/responses/whois.nic.hu/v1.99/available.txt +0 -12
  202. data/test/testcases/responses/whois.nic.hu/v1.99/in_progress.txt +0 -13
  203. data/test/testcases/responses/whois.nic.hu/v1.99/property_registrant_as_company.txt +0 -65
  204. data/test/testcases/responses/whois.nic.hu/v1.99/property_registrant_as_private_person.txt +0 -58
  205. data/test/testcases/responses/whois.nic.hu/v1.99/property_registrant_without_address.txt +0 -58
  206. data/test/testcases/responses/whois.nic.hu/v1.99/registered.txt +0 -65
  207. data/test/testcases/responses/whois.nic.im/available.txt +0 -2
  208. data/test/testcases/responses/whois.nic.im/registered.txt +0 -45
  209. data/test/testcases/responses/whois.nic.io/available.txt +0 -2
  210. data/test/testcases/responses/whois.nic.io/registered.txt +0 -2
  211. data/test/testcases/responses/whois.nic.it/available.txt +0 -2
  212. data/test/testcases/responses/whois.nic.it/property_admin_contact.txt +0 -53
  213. data/test/testcases/responses/whois.nic.it/property_registrant_contact.txt +0 -58
  214. data/test/testcases/responses/whois.nic.it/property_status_active.txt +0 -53
  215. data/test/testcases/responses/whois.nic.it/property_status_available.txt +0 -2
  216. data/test/testcases/responses/whois.nic.it/property_technical_contact.txt +0 -53
  217. data/test/testcases/responses/whois.nic.it/registered.txt +0 -53
  218. data/test/testcases/responses/whois.nic.kz/available.txt +0 -4
  219. data/test/testcases/responses/whois.nic.kz/registered.txt +0 -37
  220. data/test/testcases/responses/whois.nic.la/available.txt +0 -1
  221. data/test/testcases/responses/whois.nic.la/registered.txt +0 -70
  222. data/test/testcases/responses/whois.nic.lv/available.txt +0 -7
  223. data/test/testcases/responses/whois.nic.lv/registered.txt +0 -33
  224. data/test/testcases/responses/whois.nic.ly/available.txt +0 -1
  225. data/test/testcases/responses/whois.nic.ly/registered.txt +0 -65
  226. data/test/testcases/responses/whois.nic.mu/ki/available.txt +0 -20
  227. data/test/testcases/responses/whois.nic.mu/ki/registered.txt +0 -30
  228. data/test/testcases/responses/whois.nic.mu/mu/available.txt +0 -9
  229. data/test/testcases/responses/whois.nic.mu/mu/registered.txt +0 -22
  230. data/test/testcases/responses/whois.nic.mx/available.txt +0 -11
  231. data/test/testcases/responses/whois.nic.mx/registered.txt +0 -58
  232. data/test/testcases/responses/whois.nic.name/available.txt +0 -29
  233. data/test/testcases/responses/whois.nic.name/registered.txt +0 -36
  234. data/test/testcases/responses/whois.nic.name/reserved.txt +0 -30
  235. data/test/testcases/responses/whois.nic.net.sa/available.txt +0 -5
  236. data/test/testcases/responses/whois.nic.net.sa/registered.txt +0 -17
  237. data/test/testcases/responses/whois.nic.nu/available.txt +0 -19
  238. data/test/testcases/responses/whois.nic.nu/registered.txt +0 -35
  239. data/test/testcases/responses/whois.nic.or.kr/available.txt +0 -10
  240. data/test/testcases/responses/whois.nic.or.kr/registered.txt +0 -48
  241. data/test/testcases/responses/whois.nic.org.uy/available.txt +0 -10
  242. data/test/testcases/responses/whois.nic.org.uy/registered.txt +0 -48
  243. data/test/testcases/responses/whois.nic.sn/available.txt +0 -3
  244. data/test/testcases/responses/whois.nic.sn/registered.txt +0 -14
  245. data/test/testcases/responses/whois.nic.st/available.txt +0 -1
  246. data/test/testcases/responses/whois.nic.st/registered.txt +0 -47
  247. data/test/testcases/responses/whois.nic.tel/available.txt +0 -59
  248. data/test/testcases/responses/whois.nic.tel/registered.txt +0 -111
  249. data/test/testcases/responses/whois.nic.tl/available.txt +0 -21
  250. data/test/testcases/responses/whois.nic.tl/registered.txt +0 -29
  251. data/test/testcases/responses/whois.nic.tr/available.txt +0 -1
  252. data/test/testcases/responses/whois.nic.tr/property_nameservers_with_trailing_space.txt +0 -42
  253. data/test/testcases/responses/whois.nic.tr/registered.txt +0 -48
  254. data/test/testcases/responses/whois.nic.travel/available.txt +0 -25
  255. data/test/testcases/responses/whois.nic.travel/registered.txt +0 -75
  256. data/test/testcases/responses/whois.nic.tv/available.txt +0 -44
  257. data/test/testcases/responses/whois.nic.tv/registered.txt +0 -54
  258. data/test/testcases/responses/whois.nic.uk/available.txt +0 -20
  259. data/test/testcases/responses/whois.nic.uk/invalid.txt +0 -22
  260. data/test/testcases/responses/whois.nic.uk/registered.txt +0 -50
  261. data/test/testcases/responses/whois.nic.us/available.txt +0 -29
  262. data/test/testcases/responses/whois.nic.us/registered.txt +0 -99
  263. data/test/testcases/responses/whois.nic.ve/available.txt +0 -10
  264. data/test/testcases/responses/whois.nic.ve/registered.txt +0 -48
  265. data/test/testcases/responses/whois.norid.no/available.txt +0 -5
  266. data/test/testcases/responses/whois.norid.no/registered.txt +0 -34
  267. data/test/testcases/responses/whois.pandi.or.id/available.txt +0 -9
  268. data/test/testcases/responses/whois.pandi.or.id/registered.txt +0 -33
  269. data/test/testcases/responses/whois.publicinterestregistry.net/available.txt +0 -1
  270. data/test/testcases/responses/whois.publicinterestregistry.net/registered.txt +0 -85
  271. data/test/testcases/responses/whois.publicinterestregistry.net/throttle.txt +0 -1
  272. data/test/testcases/responses/whois.register.bg/available.txt +0 -1
  273. data/test/testcases/responses/whois.register.bg/property_nameservers_with_ip.txt +0 -42
  274. data/test/testcases/responses/whois.register.bg/registered.txt +0 -44
  275. data/test/testcases/responses/whois.registro.br/available.txt +0 -22
  276. data/test/testcases/responses/whois.registro.br/registered.txt +0 -23
  277. data/test/testcases/responses/whois.registry.in/available.txt +0 -1
  278. data/test/testcases/responses/whois.registry.in/registered.txt +0 -83
  279. data/test/testcases/responses/whois.registrypro.pro/available.txt +0 -20
  280. data/test/testcases/responses/whois.registrypro.pro/registered.txt +0 -62
  281. data/test/testcases/responses/whois.ripe.net/fo/available.txt +0 -11
  282. data/test/testcases/responses/whois.ripe.net/fo/registered.txt +0 -45
  283. data/test/testcases/responses/whois.ripe.net/gm/available.txt +0 -11
  284. data/test/testcases/responses/whois.ripe.net/gm/registered.txt +0 -37
  285. data/test/testcases/responses/whois.ripe.net/mc/available.txt +0 -11
  286. data/test/testcases/responses/whois.ripe.net/mc/registered.txt +0 -36
  287. data/test/testcases/responses/whois.ripe.net/sm/available.txt +0 -11
  288. data/test/testcases/responses/whois.ripe.net/sm/registered.txt +0 -60
  289. data/test/testcases/responses/whois.ripe.net/va/available.txt +0 -11
  290. data/test/testcases/responses/whois.ripe.net/va/registered.txt +0 -48
  291. data/test/testcases/responses/whois.ripn.net/ru/available.txt +0 -9
  292. data/test/testcases/responses/whois.ripn.net/ru/property_nameservers_with_ip.txt +0 -22
  293. data/test/testcases/responses/whois.ripn.net/ru/registered.txt +0 -24
  294. data/test/testcases/responses/whois.ripn.net/su/available.txt +0 -9
  295. data/test/testcases/responses/whois.ripn.net/su/registered.txt +0 -20
  296. data/test/testcases/responses/whois.rotld.ro/available.txt +0 -16
  297. data/test/testcases/responses/whois.rotld.ro/registered.txt +0 -27
  298. data/test/testcases/responses/whois.samoanic.ws/available.txt +0 -12
  299. data/test/testcases/responses/whois.samoanic.ws/registered.txt +0 -34
  300. data/test/testcases/responses/whois.srs.net.nz/available.txt +0 -28
  301. data/test/testcases/responses/whois.srs.net.nz/invalid.txt +0 -28
  302. data/test/testcases/responses/whois.srs.net.nz/registered.txt +0 -72
  303. data/test/testcases/responses/whois.tonic.to/1.txt +0 -1
  304. data/test/testcases/responses/whois.tonic.to/available.txt +0 -2
  305. data/test/testcases/responses/whois.tonic.to/incomplete.txt +0 -1
  306. data/test/testcases/responses/whois.tonic.to/registered.txt +0 -3
  307. data/test/testcases/responses/whois.za.net/available.txt +0 -9
  308. data/test/testcases/responses/whois.za.net/registered.txt +0 -42
  309. data/test/testcases/responses/whois.za.org/available.txt +0 -9
  310. data/test/testcases/responses/whois.za.org/registered.txt +0 -44
  311. data/test/whois/answer/contact_test.rb +0 -14
  312. data/test/whois/answer/parser/base_test.rb +0 -84
  313. data/test/whois/answer/parser/blank_test.rb +0 -19
  314. data/test/whois/answer/parser/jobswhois.verisign-grs.com_test.rb +0 -161
  315. data/test/whois/answer/parser/saudinic.net.sa_test.rb +0 -12
  316. data/test/whois/answer/parser/whois.adamsnames.tc_test.rb +0 -162
  317. data/test/whois/answer/parser/whois.aeda.net.ae_test.rb +0 -63
  318. data/test/whois/answer/parser/whois.aero_test.rb +0 -84
  319. data/test/whois/answer/parser/whois.afilias-grs.info_test.rb +0 -438
  320. data/test/whois/answer/parser/whois.afilias.info_test.rb +0 -64
  321. data/test/whois/answer/parser/whois.ai_test.rb +0 -58
  322. data/test/whois/answer/parser/whois.arnes.si_test.rb +0 -72
  323. data/test/whois/answer/parser/whois.audns.net.au_test.rb +0 -70
  324. data/test/whois/answer/parser/whois.ausregistry.net.au_test.rb +0 -12
  325. data/test/whois/answer/parser/whois.biz_test.rb +0 -64
  326. data/test/whois/answer/parser/whois.cat_test.rb +0 -64
  327. data/test/whois/answer/parser/whois.cctld.uz_test.rb +0 -91
  328. data/test/whois/answer/parser/whois.cira.ca_test.rb +0 -64
  329. data/test/whois/answer/parser/whois.cnnic.cn_test.rb +0 -73
  330. data/test/whois/answer/parser/whois.cnnic.net.cn_test.rb +0 -11
  331. data/test/whois/answer/parser/whois.crsnic.net_test.rb +0 -186
  332. data/test/whois/answer/parser/whois.denic.de_test.rb +0 -414
  333. data/test/whois/answer/parser/whois.dk-hostmaster.dk_test.rb +0 -57
  334. data/test/whois/answer/parser/whois.dns.be_test.rb +0 -65
  335. data/test/whois/answer/parser/whois.dns.lu_test.rb +0 -77
  336. data/test/whois/answer/parser/whois.dns.pt_test.rb +0 -84
  337. data/test/whois/answer/parser/whois.domain-registry.nl_test.rb +0 -62
  338. data/test/whois/answer/parser/whois.domainregistry.ie_test.rb +0 -60
  339. data/test/whois/answer/parser/whois.domreg.lt_test.rb +0 -67
  340. data/test/whois/answer/parser/whois.dot.tk_test.rb +0 -77
  341. data/test/whois/answer/parser/whois.dotmobiregistry.net_test.rb +0 -64
  342. data/test/whois/answer/parser/whois.educause.edu_test.rb +0 -64
  343. data/test/whois/answer/parser/whois.eenet.ee_test.rb +0 -91
  344. data/test/whois/answer/parser/whois.eu.org_test.rb +0 -51
  345. data/test/whois/answer/parser/whois.eu_test.rb +0 -65
  346. data/test/whois/answer/parser/whois.hkdnr.net.hk_test.rb +0 -77
  347. data/test/whois/answer/parser/whois.iana.org_test.rb +0 -63
  348. data/test/whois/answer/parser/whois.in.ua_test.rb +0 -91
  349. data/test/whois/answer/parser/whois.isnic.is_test.rb +0 -62
  350. data/test/whois/answer/parser/whois.jprs.jp_test.rb +0 -165
  351. data/test/whois/answer/parser/whois.meregistry.net_test.rb +0 -64
  352. data/test/whois/answer/parser/whois.museum_test.rb +0 -64
  353. data/test/whois/answer/parser/whois.net.ua_test.rb +0 -98
  354. data/test/whois/answer/parser/whois.nic-se.se_test.rb +0 -71
  355. data/test/whois/answer/parser/whois.nic.ac_test.rb +0 -126
  356. data/test/whois/answer/parser/whois.nic.af_test.rb +0 -84
  357. data/test/whois/answer/parser/whois.nic.ag_test.rb +0 -84
  358. data/test/whois/answer/parser/whois.nic.am_test.rb +0 -84
  359. data/test/whois/answer/parser/whois.nic.as_test.rb +0 -63
  360. data/test/whois/answer/parser/whois.nic.asia_test.rb +0 -69
  361. data/test/whois/answer/parser/whois.nic.at_test.rb +0 -65
  362. data/test/whois/answer/parser/whois.nic.cc_test.rb +0 -133
  363. data/test/whois/answer/parser/whois.nic.cd_test.rb +0 -62
  364. data/test/whois/answer/parser/whois.nic.ch_test.rb +0 -65
  365. data/test/whois/answer/parser/whois.nic.co_test.rb +0 -64
  366. data/test/whois/answer/parser/whois.nic.coop_test.rb +0 -64
  367. data/test/whois/answer/parser/whois.nic.ec_test.rb +0 -98
  368. data/test/whois/answer/parser/whois.nic.fr_test.rb +0 -281
  369. data/test/whois/answer/parser/whois.nic.gl_test.rb +0 -64
  370. data/test/whois/answer/parser/whois.nic.gov_test.rb +0 -51
  371. data/test/whois/answer/parser/whois.nic.ht_test.rb +0 -98
  372. data/test/whois/answer/parser/whois.nic.hu_test.rb +0 -321
  373. data/test/whois/answer/parser/whois.nic.im_test.rb +0 -60
  374. data/test/whois/answer/parser/whois.nic.io_test.rb +0 -51
  375. data/test/whois/answer/parser/whois.nic.it_test.rb +0 -298
  376. data/test/whois/answer/parser/whois.nic.kz_test.rb +0 -91
  377. data/test/whois/answer/parser/whois.nic.la_test.rb +0 -98
  378. data/test/whois/answer/parser/whois.nic.lv_test.rb +0 -65
  379. data/test/whois/answer/parser/whois.nic.ly_test.rb +0 -64
  380. data/test/whois/answer/parser/whois.nic.mu_test.rb +0 -123
  381. data/test/whois/answer/parser/whois.nic.mx_test.rb +0 -84
  382. data/test/whois/answer/parser/whois.nic.name_test.rb +0 -51
  383. data/test/whois/answer/parser/whois.nic.net.sa_test.rb +0 -84
  384. data/test/whois/answer/parser/whois.nic.nu_test.rb +0 -59
  385. data/test/whois/answer/parser/whois.nic.or.kr_test.rb +0 -64
  386. data/test/whois/answer/parser/whois.nic.org.uy_test.rb +0 -91
  387. data/test/whois/answer/parser/whois.nic.sn_test.rb +0 -190
  388. data/test/whois/answer/parser/whois.nic.st_test.rb +0 -77
  389. data/test/whois/answer/parser/whois.nic.tel_test.rb +0 -64
  390. data/test/whois/answer/parser/whois.nic.tl_test.rb +0 -84
  391. data/test/whois/answer/parser/whois.nic.tr_test.rb +0 -98
  392. data/test/whois/answer/parser/whois.nic.travel_test.rb +0 -64
  393. data/test/whois/answer/parser/whois.nic.tv_test.rb +0 -132
  394. data/test/whois/answer/parser/whois.nic.uk_test.rb +0 -76
  395. data/test/whois/answer/parser/whois.nic.us_test.rb +0 -64
  396. data/test/whois/answer/parser/whois.nic.ve_test.rb +0 -91
  397. data/test/whois/answer/parser/whois.norid.no_test.rb +0 -49
  398. data/test/whois/answer/parser/whois.pandi.or.id_test.rb +0 -79
  399. data/test/whois/answer/parser/whois.publicinterestregistry.net_test.rb +0 -284
  400. data/test/whois/answer/parser/whois.register.bg_test.rb +0 -69
  401. data/test/whois/answer/parser/whois.registro.br_test.rb +0 -51
  402. data/test/whois/answer/parser/whois.registry.in_test.rb +0 -69
  403. data/test/whois/answer/parser/whois.registrypro.pro_test.rb +0 -84
  404. data/test/whois/answer/parser/whois.ripe.net_test.rb +0 -266
  405. data/test/whois/answer/parser/whois.ripn.net_test.rb +0 -127
  406. data/test/whois/answer/parser/whois.rotld.ro_test.rb +0 -63
  407. data/test/whois/answer/parser/whois.samoanic.ws_test.rb +0 -64
  408. data/test/whois/answer/parser/whois.srs.net.nz_test.rb +0 -79
  409. data/test/whois/answer/parser/whois.tonic.to_test.rb +0 -125
  410. data/test/whois/answer/parser/whois.za.net_test.rb +0 -62
  411. data/test/whois/answer/parser/whois.za.org_test.rb +0 -62
  412. data/test/whois/answer/parser_test.rb +0 -219
  413. data/test/whois/answer/super_struct_test.rb +0 -24
  414. data/test/whois/answer_test.rb +0 -180
  415. data/test/whois/client_test.rb +0 -96
  416. data/test/whois/errors_test.rb +0 -23
  417. data/test/whois/integration_test.rb +0 -31
  418. data/test/whois/server/adapters/afilias_test.rb +0 -37
  419. data/test/whois/server/adapters/base_test.rb +0 -15
  420. data/test/whois/server/adapters/formatted_test.rb +0 -29
  421. data/test/whois/server/adapters/none_test.rb +0 -22
  422. data/test/whois/server/adapters/not_implemented_test.rb +0 -16
  423. data/test/whois/server/adapters/pir_test.rb +0 -37
  424. data/test/whois/server/adapters/standard_test.rb +0 -36
  425. data/test/whois/server/adapters/verisign_test.rb +0 -51
  426. data/test/whois/server/adapters/web_test.rb +0 -17
  427. data/test/whois/server_test.rb +0 -105
  428. data/utils/bm_delegation_vs_inheritance.rb +0 -150
  429. data/utils/bm_shell_vs_pure.rb +0 -14
@@ -128,7 +128,7 @@ module Whois
128
128
  def parse
129
129
  @ast = {}
130
130
  while !@input.eos?
131
- trim_newline ||
131
+ # trim_empty_line ||
132
132
  parse_content
133
133
  end
134
134
  @ast
@@ -136,20 +136,30 @@ module Whois
136
136
 
137
137
  private
138
138
 
139
- def trim_newline
140
- @input.scan(/\n/)
139
+ def parse_content
140
+ parse_disclaimer ||
141
+ parse_invalid ||
142
+ parse_not_found ||
143
+ parse_pair(@ast) ||
144
+ parse_contact ||
145
+
146
+ trim_empty_line ||
147
+ error("Unexpected token")
148
+ end
149
+
150
+ def trim_empty_line
151
+ @input.skip(/^\n/)
141
152
  end
142
153
 
143
- def parse_content
144
- parse_disclaimer ||
145
- parse_invalid ||
146
- parse_not_found ||
147
- parse_pair(@ast) ||
148
- parse_contact ||
149
- trim_newline ||
150
- error('Unexpected token')
154
+ def error(message)
155
+ if @input.eos?
156
+ raise "Unexpected end of input."
157
+ else
158
+ raise "#{message}: `#{@input.peek(@input.string.length)}'"
159
+ end
151
160
  end
152
161
 
162
+
153
163
  def parse_disclaimer
154
164
  if @input.match?(/% Copyright \(c\) *\d{4} by DENIC\n/)
155
165
  @input.scan_until(/% Terms and Conditions of Use\n/)
@@ -157,7 +167,7 @@ module Whois
157
167
  while @input.match?(/%/) && @input.scan(/%(.*)\n/)
158
168
  lines << @input[1].strip unless @input[1].strip == ""
159
169
  end
160
- @ast['Disclaimer'] = lines.join(" ")
170
+ @ast["Disclaimer"] = lines.join(" ")
161
171
  true
162
172
  end
163
173
  false
@@ -208,22 +218,17 @@ module Whois
208
218
 
209
219
  def parse_not_found
210
220
  if @input.match?(/% Object "(.*)" not found in database\n/)
211
- 6.times { @input.scan(/%(.*)\n/) } # strip junk
212
- return @ast['NotFound'] = true
221
+ while @input.scan(/%(.*)\n/) # strip junk
222
+ end
223
+ @ast["NotFound"] = true
213
224
  end
214
- @ast['NotFound'] = false
215
225
  end
216
226
 
217
227
  def parse_invalid
218
228
  if @input.match?(/% ".*" is not a valid domain name\n/)
219
- @input.scan(/%.*\n/)
220
- return @ast['Invalid'] = true
229
+ @input.scan(/%.*\n/)
230
+ @ast["Invalid"] = true
221
231
  end
222
- @ast['Invalid'] = false
223
- end
224
-
225
- def error(message)
226
- raise "#{message}: #{@input.peek(@input.string.length)}"
227
232
  end
228
233
 
229
234
  end
@@ -15,6 +15,7 @@
15
15
 
16
16
 
17
17
  require 'whois/answer/parser/base'
18
+ require 'whois/answer/parser/scanners/iana'
18
19
 
19
20
 
20
21
  module Whois
@@ -26,16 +27,11 @@ module Whois
26
27
  #
27
28
  # Parser for the whois.iana.org server.
28
29
  #
29
- # NOTE: This parser is just a stub and provides only a few basic methods
30
- # to check for domain availability and get domain status.
31
- # Please consider to contribute implementing missing methods.
32
- # See WhoisNicIt parser for an explanation of all available methods
33
- # and examples.
34
- #
35
30
  class WhoisIanaOrg < Base
31
+ include Ast
36
32
 
37
33
  property_supported :status do
38
- if available?
34
+ @status ||= if available?
39
35
  :available
40
36
  else
41
37
  :registered
@@ -43,33 +39,77 @@ module Whois
43
39
  end
44
40
 
45
41
  property_supported :available? do
46
- @available ||= !!(content_for_scanner =~ /Domain (.*?) not found/)
42
+ @available ||= !!(content_for_scanner =~ /This query returned 0 objects|organisation: Not assigned/)
47
43
  end
48
44
 
49
45
  property_supported :registered? do
50
- !available?
46
+ @registered ||= !available?
47
+ end
48
+
49
+
50
+ property_supported :registrant_contact do
51
+ @registrant_contact ||= contact("organisation", Whois::Answer::Contact::TYPE_REGISTRANT)
52
+ end
53
+
54
+ property_supported :admin_contact do
55
+ @admin_contact ||= contact("administrative", Whois::Answer::Contact::TYPE_ADMIN)
56
+ end
57
+
58
+ property_supported :technical_contact do
59
+ @technical_contact ||= contact("technical", Whois::Answer::Contact::TYPE_TECHNICAL)
51
60
  end
52
61
 
53
62
 
54
63
  property_supported :created_on do
55
- @created_on ||= if content_for_scanner =~ /\nRegistration Date:\s+(.*)\n/
56
- Time.parse($1)
57
- end
64
+ @created_on ||= node("dates") { |raw| Time.parse(raw["created"]) if raw.has_key? "created" }
58
65
  end
59
66
 
60
67
  property_supported :updated_on do
61
- @updated_on ||= if content_for_scanner =~ /\nLast Updated Date:\s+(.*)\n/
62
- Time.parse($1)
63
- end
68
+ @updated_on ||= node("dates") { |raw| Time.parse(raw["changed"]) if raw.has_key? "changed" }
64
69
  end
65
70
 
66
71
  property_not_supported :expires_on
67
72
 
68
73
 
69
74
  property_supported :nameservers do
70
- @nameservers ||= content_for_scanner.scan(/Nameserver:\s(.*)\n/).flatten.map { |value| value.chomp(".") }
75
+ @nameservers ||= nameserver("nameservers") || []
71
76
  end
72
77
 
78
+
79
+ protected
80
+
81
+ def parse
82
+ Scanners::Iana.new(content_for_scanner).parse
83
+ end
84
+
85
+ def contact(element, type)
86
+ node(element) do |raw|
87
+ if raw["organisation"] != "Not assigned"
88
+ address = (raw["address"] || "").split("\n")
89
+ Answer::Contact.new(
90
+ :type => type,
91
+ :name => raw["name"],
92
+ :organization => raw["organisation"],
93
+ :address => address[0],
94
+ :city => address[1],
95
+ :zip => address[2],
96
+ :country => address[3],
97
+ :phone => raw["phone"],
98
+ :fax => raw["fax-no"],
99
+ :email => raw["e-mail"]
100
+ )
101
+ end
102
+ end
103
+ end
104
+
105
+ def nameserver(element)
106
+ node(element) do |raw|
107
+ (raw["nserver"] || "").split("\n").map do |nameserver|
108
+ Answer::Nameserver.new(*nameserver.downcase.split(" "))
109
+ end
110
+ end
111
+ end
112
+
73
113
  end
74
114
 
75
115
  end
@@ -93,7 +93,7 @@ module Whois
93
93
  protected
94
94
 
95
95
  def parse
96
- Scanners::VerisignScanner.new(content_for_scanner).parse
96
+ Scanners::Verisign.new(content_for_scanner).parse
97
97
  end
98
98
 
99
99
  end
@@ -179,10 +179,6 @@ module Whois
179
179
 
180
180
  private
181
181
 
182
- def trim_empty_line
183
- @input.scan(/^\n/)
184
- end
185
-
186
182
  def parse_content
187
183
  parse_version ||
188
184
  parse_disclaimer ||
@@ -201,6 +197,18 @@ module Whois
201
197
  error("Unexpected token")
202
198
  end
203
199
 
200
+ def trim_empty_line
201
+ @input.skip(/^\n/)
202
+ end
203
+
204
+ def error(message)
205
+ if @input.eos?
206
+ raise "Unexpected end of input."
207
+ else
208
+ raise "#{message}: `#{@input.peek(@input.string.length)}'"
209
+ end
210
+ end
211
+
204
212
 
205
213
  def parse_version
206
214
  if @input.match?(/% Whois server .*\n/)
@@ -354,10 +362,6 @@ module Whois
354
362
  true
355
363
  end
356
364
 
357
- def error(message)
358
- raise "#{message}: `#{@input.peek(@input.string.length)}'"
359
- end
360
-
361
365
  end
362
366
 
363
367
  end
@@ -51,7 +51,7 @@ module Whois
51
51
  end
52
52
 
53
53
  property_supported :available? do
54
- @available ||= node("Status") == "AVAILABLE"
54
+ @available ||= node("Status") == "AVAILABLE"
55
55
  end
56
56
 
57
57
  property_supported :registered? do
@@ -94,7 +94,7 @@ module Whois
94
94
  protected
95
95
 
96
96
  def parse
97
- Scanners::VerisignScanner.new(content_for_scanner).parse
97
+ Scanners::Verisign.new(content_for_scanner).parse
98
98
  end
99
99
 
100
100
  end
@@ -168,11 +168,12 @@ module Whois
168
168
  private
169
169
 
170
170
  def parse_content
171
- trim_empty_line ||
172
171
  parse_not_found ||
173
172
  parse_throttle ||
174
173
  parse_disclaimer ||
175
174
  parse_pair ||
175
+
176
+ trim_empty_line ||
176
177
  error("Unexpected token")
177
178
  end
178
179
 
@@ -180,6 +181,15 @@ module Whois
180
181
  @input.skip(/^\n/)
181
182
  end
182
183
 
184
+ def error(message)
185
+ if @input.eos?
186
+ raise "Unexpected end of input."
187
+ else
188
+ raise "#{message}: `#{@input.peek(@input.string.length)}'"
189
+ end
190
+ end
191
+
192
+
183
193
  def parse_not_found
184
194
  @input.skip(/^NOT FOUND\n/)
185
195
  end
@@ -217,14 +227,6 @@ module Whois
217
227
  end
218
228
  end
219
229
 
220
- def error(message)
221
- if @input.eos?
222
- raise "Unexpected end of input."
223
- else
224
- raise "#{message}: `#{@input.peek(@input.string.length)}'"
225
- end
226
- end
227
-
228
230
  end
229
231
 
230
232
  end
@@ -27,10 +27,10 @@ module Whois
27
27
  #
28
28
  # A Registrar is composed by the following attributes:
29
29
  #
30
- # * <tt>:id</tt>::
31
- # * <tt>:name</tt>::
32
- # * <tt>:organization</tt>::
33
- # * <tt>:url</tt>::
30
+ # * <tt>:id</tt>:
31
+ # * <tt>:name</tt>:
32
+ # * <tt>:organization</tt>:
33
+ # * <tt>:url</tt>:
34
34
  #
35
35
  # Be aware that every WHOIS server can return a different number of details
36
36
  # or no details at all.
@@ -39,4 +39,4 @@ module Whois
39
39
  end
40
40
 
41
41
  end
42
- end
42
+ end
data/lib/whois/client.rb CHANGED
@@ -46,7 +46,6 @@ module Whois
46
46
  # end
47
47
  # client.query("google.com")
48
48
  #
49
- #
50
49
  # Returns a <tt>Whois::Client</tt>.
51
50
  def initialize(options = {}, &block)
52
51
  self.timeout = options[:timeout] || DEFAULT_TIMEOUT
data/lib/whois/errors.rb CHANGED
@@ -16,34 +16,34 @@
16
16
 
17
17
  module Whois
18
18
 
19
- # The base error class for all Whois error classes.
19
+ # The base error class for all <tt>Whois</tt> error classes.
20
20
  class Error < StandardError
21
21
  end
22
-
23
-
24
- # Generic Server exception class.
22
+
23
+
24
+ # Generic <tt>Whois::Server</tt> exception class.
25
25
  class ServerError < Error
26
26
  end
27
-
27
+
28
28
  # Server Definition not found
29
-
29
+
30
30
  # Raised when the class hasn't been able to select a valid server
31
31
  # probably because definitions are outdated.
32
32
  class ServerNotFound < ServerError
33
33
  end
34
-
34
+
35
35
  # Server Definition found
36
-
36
+
37
37
  class InterfaceNotSupported < ServerError
38
38
  end
39
-
39
+
40
40
  # Raised when a server is known to not be available for this kind of object
41
41
  # or because this specific object doesn't support WHOIS. (\x03)
42
42
  class NoInterfaceError < InterfaceNotSupported
43
43
  end
44
-
44
+
45
45
  # Raised when the class has found a server but it doesn't support the
46
- # standard whois interface via port 43. This is the case of some
46
+ # standard WHOIS interface via port 43. This is the case of some
47
47
  # specific domains that only provide a web–based WHOIS interface. (\x01)
48
48
  class WebInterfaceError < InterfaceNotSupported
49
49
  attr_reader :url
@@ -61,19 +61,19 @@ module Whois
61
61
  class ServerNotImplemented < ServerError
62
62
  end
63
63
 
64
- # Raised when no whois server is known for this kind of object. (\x05)
64
+ # Raised when no WHOIS server is known for this kind of object. (\x05)
65
65
  class ServerNotSupported < ServerError
66
66
  end
67
-
68
- # Raised when unknown AS numer of IP network. (\x06)
67
+
68
+ # Raised when unknown AS number of IP network. (\x06)
69
69
  class AllocationUnknown < ServerError
70
70
  end
71
-
72
-
73
- # Generic Parser exception class.
71
+
72
+
73
+ # Generic <tt>Whois::Answer::Parser</tt> exception class.
74
74
  class ParserError < Error
75
75
  end
76
-
76
+
77
77
  # Raised when the class hasn't been able to load a valid parser
78
78
  # according to current settings.
79
79
  class ParserNotFound < ParserError
@@ -94,4 +94,4 @@ module Whois
94
94
  class PropertyNotAvailable < ParserError
95
95
  end
96
96
 
97
- end
97
+ end
data/lib/whois/server.rb CHANGED
@@ -44,14 +44,30 @@ module Whois
44
44
  Dir[File.dirname(__FILE__) + '/definitions/*.rb'].each { |file| load(file) }
45
45
  end
46
46
 
47
- # Returns the active definition list.
48
- # If <tt>type</tt>, returns only the definitions matching given type or
49
- # nil if no definition exists.
47
+ # Lookup and returns the definition list for given <tt>type</tt>,
48
+ # or all definitions if <tt>type</tt> is <tt>nil</tt>.
49
+ #
50
+ # ==== Parameters
51
+ #
52
+ # type:: The type of WHOIS server to lookup.
53
+ # Known values are :tld, :ipv4, :ipv6.
54
+ #
55
+ # ==== Returns
56
+ #
57
+ # Hash:: If the method is called without specifying a <tt>type</tt>.
58
+ # Array:: If the method is called specifying a <tt>type</tt>,
59
+ # and the <tt>type</tt> exists.
60
+ # nil:: If the method is called specifying a <tt>type</tt>,
61
+ # and the <tt>type</tt> doesn't exist.
62
+ #
63
+ # ==== Examples
50
64
  #
51
65
  # Whois::Server.definitions
52
66
  # # => { :tld => [...], :ipv4 => [], ... }
67
+ #
53
68
  # Whois::Server.definitions(:tld)
54
69
  # # => [...]
70
+ #
55
71
  # Whois::Server.definitions(:invalid)
56
72
  # # => nil
57
73
  #
@@ -65,27 +81,42 @@ module Whois
65
81
 
66
82
  # Defines a new server for <tt>:type</tt> queries.
67
83
  #
68
- # == Parameters
84
+ # ==== Parameters
85
+ #
86
+ # type:: The type of WHOIS server to define.
87
+ # Known values are :tld, :ipv4, :ipv6.
88
+ # allocation:: The allocation, range or hostname
89
+ # this server is responsible for.
90
+ # host:: The server hostname.
91
+ # Use nil if unknown or not available.
92
+ # options:: Hash of options to customize Adapter behavior.
93
+ # The <tt>:adapter</tt> option has a special meaning and determines
94
+ # the adapter Class to use.
95
+ # Defaults to </tt>Whois::Server::Adapters::Standard</tt> unless specified.
96
+ # All the other options are passed directly to the adapter which
97
+ # can decide how to use them.
98
+ #
99
+ # ==== Returns
69
100
  #
70
- # type::
71
- # The type of whois server to define.
72
- # Allowed values are :tld, :ipv4, :ipv6.
73
- # allocation::
74
- # The allocation, range or hostname this server is responsible for.
75
- # host::
76
- # The server hostname.
77
- # options::
78
- # Additional options to customize Adpter behavior.
101
+ # Nothing.
79
102
  #
80
103
  # ==== Examples
81
104
  #
82
105
  # # Define a server for the .it extension
83
106
  # Whois::Server.define :tld, ".it", "whois.nic.it"
107
+ #
84
108
  # # Define a new server for an range of IPv4 addresses
85
109
  # Whois::Server.define :ipv4, "61.192.0.0/12", "whois.nic.ad.jp"
110
+ #
86
111
  # # Define a new server for an range of IPv6 addresses
87
112
  # Whois::Server.define :ipv6, "2001:2000::/19", "whois.ripe.net"
88
113
  #
114
+ # # Define a new server with a custom adapter
115
+ # Whois::Server.define :tld, ".test", nil, :adapter => Whois::Server::Adapter::None
116
+ #
117
+ # # Define a new server with a custom adapter and options
118
+ # Whois::Server.define :tld, ".ar", nil, :adapter => Whois::Server::Adapters::Web, :web => "http://www.nic.ar/"
119
+ #
89
120
  def self.define(type, allocation, host, options = {})
90
121
  @@definitions[type] ||= []
91
122
  @@definitions[type] << [allocation, host, options]
@@ -94,14 +125,39 @@ module Whois
94
125
  # Creates a new server adapter from given arguments
95
126
  # and returns the server instance.
96
127
  #
97
- # By default returns a new Whois::Servers::Adapter::Standard instance.
98
- # You can customize the behavior passing a custom adapter class as :adapter option.
128
+ # By default, returns a new Whois::Servers::Adapter::Standard instance.
129
+ # You can customize the behavior passing a custom adapter class as <tt>:adapter</tt> option.
99
130
  #
100
131
  # Whois::Server.factory :tld, ".it", "whois.nic.it"
101
132
  # # => #<Whois::Servers::Adapter::Standard>
133
+ #
102
134
  # Whois::Server.factory :tld, ".it", "whois.nic.it", :option => Whois::Servers::Adapter::Custom
103
135
  # # => #<Whois::Servers::Adapter::Custom>
104
136
  #
137
+ # Please note that any adapter is responsible for a limited set of queries,
138
+ # which should be included in the range of the <tt>allocation</tt> parameter.
139
+ # Use <tt>Whois::Server#guess</tt> if you are not sure which adapter is the right one
140
+ # for a specific string.
141
+ #
142
+ # ==== Parameters
143
+ #
144
+ # type:: The type of WHOIS server to create.
145
+ # Known values are :tld, :ipv4, :ipv6.
146
+ # allocation:: The allocation, range or hostname
147
+ # this server is responsible for.
148
+ # host:: The server hostname.
149
+ # Use nil if unknown or not available.
150
+ # options:: Hash of options to customize Adapter behavior.
151
+ # The <tt>:adapter</tt> option has a special meaning and determines
152
+ # the adapter Class to use.
153
+ # Defaults to </tt>Whois::Server::Adapters::Standard</tt> unless specified.
154
+ # All the other options are passed directly to the adapter which
155
+ # can decide how to use them.
156
+ #
157
+ # ==== Returns
158
+ #
159
+ # Whois::Server::Adapters::Standard:: An adapter that can be used to perform queries.
160
+ #
105
161
  def self.factory(type, allocation, host, options = {})
106
162
  options = options.dup
107
163
  (options.delete(:adapter) || Adapters::Standard).new(type, allocation, host, options)
@@ -113,32 +169,47 @@ module Whois
113
169
  # It successfully detects the following query types:
114
170
  # * ipv6
115
171
  # * ipv4
116
- # * top level domains
172
+ # * top level domains (e.g. .com, .net, .it)
173
+ # * domain names (e.g. google.com, google.net, google.it)
117
174
  # * emails
118
175
  #
176
+ # Note that not all query types actually have a corresponding adapter.
177
+ # For instance, the following request will result in a
178
+ # <tt>Whois::ServerNotSupported</tt> exception.
179
+ #
180
+ # Whois::Server.guess "mail@example.com"
181
+ #
182
+ # ==== Returns
183
+ #
184
+ # Whois::Server::Adapters::Base:: The adapter that can be used to perform
185
+ # WHOIS queries for <tt>qstring</tt>.
186
+ #
119
187
  # ==== Raises
120
188
  #
121
- # ServerNotFound::
122
- # When unable to find an appropriate whois server for <tt>qstring</tt>.
189
+ # ServerNotFound:: When unable to find an appropriate WHOIS adapter
190
+ # for <tt>qstring</tt>. Most of the cases, the <tt>qstring</tt>
191
+ # haven't been recognised as one of the supported query types.
192
+ # ServerNotSupported:: When the <tt>qstring</tt> type is detected,
193
+ # but the object type doesn't have any supported WHOIS adapter associated.
123
194
  #
124
195
  def self.guess(qstring)
125
- # IPv6 address (secure match)
126
- if valid_ipv6?(qstring)
127
- return find_for_ipv6(qstring)
196
+ # Top Level Domain match
197
+ if matches_tld?(qstring)
198
+ return factory(:tld, ".", "whois.iana.org")
128
199
  end
129
-
130
- # IPv4 address (secure match)
131
- if valid_ipv4?(qstring)
132
- return find_for_ipv4(qstring)
200
+
201
+ # IP address (secure match)
202
+ if matches_ip?(qstring)
203
+ return find_for_ip(qstring)
133
204
  end
134
205
 
135
206
  # Email Address (secure match)
136
- if qstring =~ /@/
207
+ if matches_email?(qstring)
137
208
  return find_for_email(qstring)
138
209
  end
139
-
140
- # TLD
141
- if server = find_for_tld(qstring)
210
+
211
+ # Domain Name match
212
+ if server = find_for_domain(qstring)
142
213
  return server
143
214
  end
144
215
 
@@ -149,41 +220,42 @@ module Whois
149
220
 
150
221
  private
151
222
 
152
- def self.find_for_ipv6(qstring)
153
- ip = IPAddr.new(qstring)
154
- definitions(:ipv6).each do |definition|
155
- if IPAddr.new(definition.first).include?(ip)
156
- return factory(:ipv6, *definition)
157
- end
158
- end
159
- raise AllocationUnknown,
160
- "IP Allocation for `#{qstring}' unknown." +
161
- "Server definitions might be outdated."
223
+ def self.matches_tld?(string)
224
+ string =~ /^\.(xn--)?[a-z0-9]+$/
225
+ end
226
+
227
+ def self.matches_ip?(string)
228
+ valid_ipv4?(string) || valid_ipv6?(string)
162
229
  end
163
230
 
164
- def self.find_for_ipv4(qstring)
231
+ def self.matches_email?(string)
232
+ string =~ /@/
233
+ end
234
+
235
+
236
+ def self.find_for_ip(qstring)
165
237
  ip = IPAddr.new(qstring)
166
- definitions(:ipv4).each do |definition|
238
+ type = ip.ipv4? ? :ipv4 : :ipv6
239
+ definitions(type).each do |definition|
167
240
  if IPAddr.new(definition.first).include?(ip)
168
- return factory(:ipv4, *definition)
241
+ return factory(type, *definition)
169
242
  end
170
243
  end
171
- raise AllocationUnknown,
172
- "IP Allocation for `#{qstring}' unknown." +
173
- "Server definitions might be outdated."
244
+ raise AllocationUnknown, "IP Allocation for `#{qstring}' unknown. Server definitions might be outdated."
174
245
  end
175
246
 
176
247
  def self.find_for_email(qstring)
177
- raise ServerNotSupported, "No whois server is known for email objects"
248
+ raise ServerNotSupported, "No WHOIS server is known for email objects"
178
249
  end
179
250
 
180
- def self.find_for_tld(qstring)
251
+ def self.find_for_domain(qstring)
181
252
  definitions(:tld).each do |definition|
182
253
  return factory(:tld, *definition) if /#{Regexp.escape(definition.first)}$/ =~ qstring
183
254
  end
184
255
  nil
185
256
  end
186
257
 
258
+
187
259
  def self.valid_ipv4?(addr)
188
260
  if /\A(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\Z/ =~ addr
189
261
  return $~.captures.all? {|i| i.to_i < 256}