whois 1.2.2 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +23 -0
- data/README.rdoc +24 -7
- data/lib/core_ext.rb +4 -3
- data/lib/whois/answer/contact.rb +1 -1
- data/lib/whois/answer/nameserver.rb +41 -0
- data/lib/whois/answer/parser/base.rb +1 -0
- data/lib/whois/answer/parser/jobswhois.verisign-grs.com.rb +2 -2
- data/lib/whois/answer/parser/scanners/iana.rb +145 -0
- data/lib/whois/answer/parser/scanners/verisign.rb +15 -15
- data/lib/whois/answer/parser/whois.crsnic.net.rb +2 -2
- data/lib/whois/answer/parser/whois.denic.de.rb +27 -22
- data/lib/whois/answer/parser/whois.iana.org.rb +56 -16
- data/lib/whois/answer/parser/whois.nic.cc.rb +1 -1
- data/lib/whois/answer/parser/whois.nic.hu.rb +12 -8
- data/lib/whois/answer/parser/whois.nic.it.rb +1 -1
- data/lib/whois/answer/parser/whois.nic.tv.rb +1 -1
- data/lib/whois/answer/parser/whois.publicinterestregistry.net.rb +11 -9
- data/lib/whois/answer/registrar.rb +5 -5
- data/lib/whois/client.rb +0 -1
- data/lib/whois/errors.rb +19 -19
- data/lib/whois/server.rb +119 -47
- data/lib/whois/server/adapters/base.rb +44 -2
- data/lib/whois/version.rb +4 -3
- data/whois.gemspec +9 -18
- metadata +26 -713
- data/Manifest +0 -541
- data/Rakefile +0 -82
- data/data/ip6_del_list +0 -47
- data/data/ip_del_list +0 -245
- data/data/make_ip6_del.pl +0 -38
- data/data/make_ip_del.pl +0 -25
- data/data/make_servers_charset.pl +0 -21
- data/data/make_tld_serv.pl +0 -23
- data/data/servers_charset_list +0 -38
- data/data/tld_serv_list +0 -377
- data/tasks/server.rake +0 -109
- data/test/list_tld +0 -324
- data/test/test_helper.rb +0 -56
- data/test/testcases/referrals/afilias.bz.txt +0 -40
- data/test/testcases/referrals/crsnic.com.txt +0 -210
- data/test/testcases/referrals/crsnic.com_more_servers.txt +0 -210
- data/test/testcases/referrals/crsnic.com_one_server.txt +0 -57
- data/test/testcases/referrals/niccc.cc.txt +0 -59
- data/test/testcases/referrals/pir.org.txt +0 -84
- data/test/testcases/responses/UTF8.txt +0 -10
- data/test/testcases/responses/jobswhois.verisign-grs.com/available.txt +0 -44
- data/test/testcases/responses/jobswhois.verisign-grs.com/property_registrar.txt +0 -54
- data/test/testcases/responses/jobswhois.verisign-grs.com/registered.txt +0 -54
- data/test/testcases/responses/whois.adamsnames.tc/gd/available.txt +0 -2
- data/test/testcases/responses/whois.adamsnames.tc/gd/registered.txt +0 -26
- data/test/testcases/responses/whois.adamsnames.tc/tc/available.txt +0 -2
- data/test/testcases/responses/whois.adamsnames.tc/tc/registered.txt +0 -28
- data/test/testcases/responses/whois.adamsnames.tc/vg/available.txt +0 -2
- data/test/testcases/responses/whois.adamsnames.tc/vg/registered.txt +0 -28
- data/test/testcases/responses/whois.aeda.net.ae/available.txt +0 -1
- data/test/testcases/responses/whois.aeda.net.ae/registered.txt +0 -15
- data/test/testcases/responses/whois.aero/available.txt +0 -1
- data/test/testcases/responses/whois.aero/registered.txt +0 -102
- data/test/testcases/responses/whois.afilias-grs.info/bz/available.txt +0 -1
- data/test/testcases/responses/whois.afilias-grs.info/bz/registered.txt +0 -122
- data/test/testcases/responses/whois.afilias-grs.info/gi/available.txt +0 -1
- data/test/testcases/responses/whois.afilias-grs.info/gi/registered.txt +0 -98
- data/test/testcases/responses/whois.afilias-grs.info/hn/available.txt +0 -1
- data/test/testcases/responses/whois.afilias-grs.info/hn/registered.txt +0 -85
- data/test/testcases/responses/whois.afilias-grs.info/lc/available.txt +0 -1
- data/test/testcases/responses/whois.afilias-grs.info/lc/registered.txt +0 -83
- data/test/testcases/responses/whois.afilias-grs.info/mn/available.txt +0 -1
- data/test/testcases/responses/whois.afilias-grs.info/mn/registered.txt +0 -100
- data/test/testcases/responses/whois.afilias-grs.info/sc/available.txt +0 -1
- data/test/testcases/responses/whois.afilias-grs.info/sc/registered.txt +0 -85
- data/test/testcases/responses/whois.afilias-grs.info/vc/available.txt +0 -1
- data/test/testcases/responses/whois.afilias-grs.info/vc/registered.txt +0 -100
- data/test/testcases/responses/whois.afilias.info/available.txt +0 -1
- data/test/testcases/responses/whois.afilias.info/registered.txt +0 -104
- data/test/testcases/responses/whois.ai/available.txt +0 -2
- data/test/testcases/responses/whois.ai/registered.txt +0 -59
- data/test/testcases/responses/whois.arnes.si/available.txt +0 -29
- data/test/testcases/responses/whois.arnes.si/registered.txt +0 -55
- data/test/testcases/responses/whois.audns.net.au/available.txt +0 -1
- data/test/testcases/responses/whois.audns.net.au/registered.txt +0 -23
- data/test/testcases/responses/whois.biz/available.txt +0 -25
- data/test/testcases/responses/whois.biz/registered.txt +0 -89
- data/test/testcases/responses/whois.cat/available.txt +0 -18
- data/test/testcases/responses/whois.cat/registered.txt +0 -83
- data/test/testcases/responses/whois.cctld.uz/available.txt +0 -12
- data/test/testcases/responses/whois.cctld.uz/registered.txt +0 -123
- data/test/testcases/responses/whois.cira.ca/available.txt +0 -9
- data/test/testcases/responses/whois.cira.ca/registered.txt +0 -47
- data/test/testcases/responses/whois.cnnic.cn/available.txt +0 -1
- data/test/testcases/responses/whois.cnnic.cn/registered.txt +0 -19
- data/test/testcases/responses/whois.crsnic.net/MULTIPLE.txt +0 -3
- data/test/testcases/responses/whois.crsnic.net/available.txt +0 -43
- data/test/testcases/responses/whois.crsnic.net/nameservers_with_no_nameserver.txt +0 -67
- data/test/testcases/responses/whois.crsnic.net/registered.txt +0 -57
- data/test/testcases/responses/whois.crsnic.net/registered_with_multiple_entries.txt +0 -235
- data/test/testcases/responses/whois.denic.de/1-10-0_available.txt +0 -30
- data/test/testcases/responses/whois.denic.de/1-10-0_registered.txt +0 -77
- data/test/testcases/responses/whois.denic.de/available.txt +0 -42
- data/test/testcases/responses/whois.denic.de/error_invalid_domain_name.txt +0 -37
- data/test/testcases/responses/whois.denic.de/property_nameservers_with_ip.txt +0 -67
- data/test/testcases/responses/whois.denic.de/property_technical_contact.txt +0 -70
- data/test/testcases/responses/whois.denic.de/registered.txt +0 -70
- data/test/testcases/responses/whois.dk-hostmaster.dk/available.txt +0 -15
- data/test/testcases/responses/whois.dk-hostmaster.dk/registered.txt +0 -47
- data/test/testcases/responses/whois.dns.be/available.txt +0 -41
- data/test/testcases/responses/whois.dns.be/registered.txt +0 -66
- data/test/testcases/responses/whois.dns.lu/available.txt +0 -26
- data/test/testcases/responses/whois.dns.lu/property_nameservers_with_ip.txt +0 -55
- data/test/testcases/responses/whois.dns.lu/registered.txt +0 -57
- data/test/testcases/responses/whois.dns.pt/available.txt +0 -1
- data/test/testcases/responses/whois.dns.pt/registered.txt +0 -32
- data/test/testcases/responses/whois.domain-registry.nl/available.txt +0 -21
- data/test/testcases/responses/whois.domain-registry.nl/registered.txt +0 -67
- data/test/testcases/responses/whois.domainregistry.ie/available.txt +0 -7
- data/test/testcases/responses/whois.domainregistry.ie/registered.txt +0 -26
- data/test/testcases/responses/whois.domreg.lt/available.txt +0 -18
- data/test/testcases/responses/whois.domreg.lt/property_nameservers_with_ip.txt +0 -32
- data/test/testcases/responses/whois.domreg.lt/registered.txt +0 -37
- data/test/testcases/responses/whois.dot.tk/available.txt +0 -1
- data/test/testcases/responses/whois.dot.tk/registered.txt +0 -28
- data/test/testcases/responses/whois.dotmobiregistry.net/available.txt +0 -25
- data/test/testcases/responses/whois.dotmobiregistry.net/registered.txt +0 -81
- data/test/testcases/responses/whois.educause.edu/available.txt +0 -28
- data/test/testcases/responses/whois.educause.edu/registered.txt +0 -66
- data/test/testcases/responses/whois.eenet.ee/available.txt +0 -6
- data/test/testcases/responses/whois.eenet.ee/registered.txt +0 -27
- data/test/testcases/responses/whois.eu.org/available.txt +0 -1
- data/test/testcases/responses/whois.eu.org/registered.txt +0 -19
- data/test/testcases/responses/whois.eu/available.txt +0 -47
- data/test/testcases/responses/whois.eu/property_nameservers_with_ip.txt +0 -61
- data/test/testcases/responses/whois.eu/registered.txt +0 -63
- data/test/testcases/responses/whois.hkdnr.net.hk/available.txt +0 -1
- data/test/testcases/responses/whois.hkdnr.net.hk/registered.txt +0 -96
- data/test/testcases/responses/whois.iana.org/MULTIPLE.txt +0 -3
- data/test/testcases/responses/whois.iana.org/available.txt +0 -7
- data/test/testcases/responses/whois.iana.org/registered.txt +0 -89
- data/test/testcases/responses/whois.in.ua/available.txt +0 -4
- data/test/testcases/responses/whois.in.ua/registered.txt +0 -16
- data/test/testcases/responses/whois.isnic.is/available.txt +0 -7
- data/test/testcases/responses/whois.isnic.is/registered.txt +0 -57
- data/test/testcases/responses/whois.jprs.jp/jp/available.txt +0 -17
- data/test/testcases/responses/whois.jprs.jp/jp/registered.txt +0 -30
- data/test/testcases/responses/whois.jprs.jp/ne.jp/available.txt +0 -17
- data/test/testcases/responses/whois.jprs.jp/ne.jp/registered.txt +0 -19
- data/test/testcases/responses/whois.meregistry.net/available.txt +0 -1
- data/test/testcases/responses/whois.meregistry.net/registered.txt +0 -94
- data/test/testcases/responses/whois.museum/available.txt +0 -18
- data/test/testcases/responses/whois.museum/registered.txt +0 -92
- data/test/testcases/responses/whois.net.ua/available.txt +0 -7
- data/test/testcases/responses/whois.net.ua/property_nameservers_uppercase.txt +0 -29
- data/test/testcases/responses/whois.net.ua/redirect_to_whois.in.ua.txt +0 -29
- data/test/testcases/responses/whois.net.ua/registered.txt +0 -58
- data/test/testcases/responses/whois.nic-se.se/available.txt +0 -21
- data/test/testcases/responses/whois.nic-se.se/property_nameservers_with_ip.txt +0 -37
- data/test/testcases/responses/whois.nic-se.se/registered.txt +0 -37
- data/test/testcases/responses/whois.nic.ac/available.txt +0 -2
- data/test/testcases/responses/whois.nic.ac/registered.txt +0 -2
- data/test/testcases/responses/whois.nic.af/available.txt +0 -13
- data/test/testcases/responses/whois.nic.af/registered.txt +0 -56
- data/test/testcases/responses/whois.nic.ag/available.txt +0 -1
- data/test/testcases/responses/whois.nic.ag/registered.txt +0 -100
- data/test/testcases/responses/whois.nic.am/available.txt +0 -3
- data/test/testcases/responses/whois.nic.am/registered.txt +0 -42
- data/test/testcases/responses/whois.nic.as/available.txt +0 -12
- data/test/testcases/responses/whois.nic.as/registered.txt +0 -18
- data/test/testcases/responses/whois.nic.asia/available.txt +0 -1
- data/test/testcases/responses/whois.nic.asia/registered.txt +0 -159
- data/test/testcases/responses/whois.nic.at/available.txt +0 -25
- data/test/testcases/responses/whois.nic.at/registered.txt +0 -65
- data/test/testcases/responses/whois.nic.cc/available.txt +0 -44
- data/test/testcases/responses/whois.nic.cc/registered.txt +0 -58
- data/test/testcases/responses/whois.nic.cd/available.txt +0 -1
- data/test/testcases/responses/whois.nic.cd/registered.txt +0 -85
- data/test/testcases/responses/whois.nic.ch/available.txt +0 -2
- data/test/testcases/responses/whois.nic.ch/property_nameservers_with_ip.txt +0 -27
- data/test/testcases/responses/whois.nic.ch/registered.txt +0 -28
- data/test/testcases/responses/whois.nic.co/available.txt +0 -28
- data/test/testcases/responses/whois.nic.co/registered.txt +0 -82
- data/test/testcases/responses/whois.nic.coop/available.txt +0 -33
- data/test/testcases/responses/whois.nic.coop/registered.txt +0 -123
- data/test/testcases/responses/whois.nic.ec/available.txt +0 -1
- data/test/testcases/responses/whois.nic.ec/registered.txt +0 -40
- data/test/testcases/responses/whois.nic.fr/fr/available.txt +0 -19
- data/test/testcases/responses/whois.nic.fr/fr/registered.txt +0 -98
- data/test/testcases/responses/whois.nic.fr/pm/available.txt +0 -19
- data/test/testcases/responses/whois.nic.fr/pm/registered.txt +0 -88
- data/test/testcases/responses/whois.nic.fr/re/available.txt +0 -19
- data/test/testcases/responses/whois.nic.fr/re/registered.txt +0 -83
- data/test/testcases/responses/whois.nic.fr/wf/available.txt +0 -19
- data/test/testcases/responses/whois.nic.fr/wf/registered.txt +0 -88
- data/test/testcases/responses/whois.nic.fr/yt/available.txt +0 -19
- data/test/testcases/responses/whois.nic.fr/yt/registered.txt +0 -88
- data/test/testcases/responses/whois.nic.gl/available.txt +0 -23
- data/test/testcases/responses/whois.nic.gl/registered.txt +0 -40
- data/test/testcases/responses/whois.nic.gov/available.txt +0 -1
- data/test/testcases/responses/whois.nic.gov/registered.txt +0 -5
- data/test/testcases/responses/whois.nic.ht/available.txt +0 -23
- data/test/testcases/responses/whois.nic.ht/registered.txt +0 -59
- data/test/testcases/responses/whois.nic.hu/current/available.txt +0 -3
- data/test/testcases/responses/whois.nic.hu/current/registered.txt +0 -9
- data/test/testcases/responses/whois.nic.hu/v1.99/available.txt +0 -12
- data/test/testcases/responses/whois.nic.hu/v1.99/in_progress.txt +0 -13
- data/test/testcases/responses/whois.nic.hu/v1.99/property_registrant_as_company.txt +0 -65
- data/test/testcases/responses/whois.nic.hu/v1.99/property_registrant_as_private_person.txt +0 -58
- data/test/testcases/responses/whois.nic.hu/v1.99/property_registrant_without_address.txt +0 -58
- data/test/testcases/responses/whois.nic.hu/v1.99/registered.txt +0 -65
- data/test/testcases/responses/whois.nic.im/available.txt +0 -2
- data/test/testcases/responses/whois.nic.im/registered.txt +0 -45
- data/test/testcases/responses/whois.nic.io/available.txt +0 -2
- data/test/testcases/responses/whois.nic.io/registered.txt +0 -2
- data/test/testcases/responses/whois.nic.it/available.txt +0 -2
- data/test/testcases/responses/whois.nic.it/property_admin_contact.txt +0 -53
- data/test/testcases/responses/whois.nic.it/property_registrant_contact.txt +0 -58
- data/test/testcases/responses/whois.nic.it/property_status_active.txt +0 -53
- data/test/testcases/responses/whois.nic.it/property_status_available.txt +0 -2
- data/test/testcases/responses/whois.nic.it/property_technical_contact.txt +0 -53
- data/test/testcases/responses/whois.nic.it/registered.txt +0 -53
- data/test/testcases/responses/whois.nic.kz/available.txt +0 -4
- data/test/testcases/responses/whois.nic.kz/registered.txt +0 -37
- data/test/testcases/responses/whois.nic.la/available.txt +0 -1
- data/test/testcases/responses/whois.nic.la/registered.txt +0 -70
- data/test/testcases/responses/whois.nic.lv/available.txt +0 -7
- data/test/testcases/responses/whois.nic.lv/registered.txt +0 -33
- data/test/testcases/responses/whois.nic.ly/available.txt +0 -1
- data/test/testcases/responses/whois.nic.ly/registered.txt +0 -65
- data/test/testcases/responses/whois.nic.mu/ki/available.txt +0 -20
- data/test/testcases/responses/whois.nic.mu/ki/registered.txt +0 -30
- data/test/testcases/responses/whois.nic.mu/mu/available.txt +0 -9
- data/test/testcases/responses/whois.nic.mu/mu/registered.txt +0 -22
- data/test/testcases/responses/whois.nic.mx/available.txt +0 -11
- data/test/testcases/responses/whois.nic.mx/registered.txt +0 -58
- data/test/testcases/responses/whois.nic.name/available.txt +0 -29
- data/test/testcases/responses/whois.nic.name/registered.txt +0 -36
- data/test/testcases/responses/whois.nic.name/reserved.txt +0 -30
- data/test/testcases/responses/whois.nic.net.sa/available.txt +0 -5
- data/test/testcases/responses/whois.nic.net.sa/registered.txt +0 -17
- data/test/testcases/responses/whois.nic.nu/available.txt +0 -19
- data/test/testcases/responses/whois.nic.nu/registered.txt +0 -35
- data/test/testcases/responses/whois.nic.or.kr/available.txt +0 -10
- data/test/testcases/responses/whois.nic.or.kr/registered.txt +0 -48
- data/test/testcases/responses/whois.nic.org.uy/available.txt +0 -10
- data/test/testcases/responses/whois.nic.org.uy/registered.txt +0 -48
- data/test/testcases/responses/whois.nic.sn/available.txt +0 -3
- data/test/testcases/responses/whois.nic.sn/registered.txt +0 -14
- data/test/testcases/responses/whois.nic.st/available.txt +0 -1
- data/test/testcases/responses/whois.nic.st/registered.txt +0 -47
- data/test/testcases/responses/whois.nic.tel/available.txt +0 -59
- data/test/testcases/responses/whois.nic.tel/registered.txt +0 -111
- data/test/testcases/responses/whois.nic.tl/available.txt +0 -21
- data/test/testcases/responses/whois.nic.tl/registered.txt +0 -29
- data/test/testcases/responses/whois.nic.tr/available.txt +0 -1
- data/test/testcases/responses/whois.nic.tr/property_nameservers_with_trailing_space.txt +0 -42
- data/test/testcases/responses/whois.nic.tr/registered.txt +0 -48
- data/test/testcases/responses/whois.nic.travel/available.txt +0 -25
- data/test/testcases/responses/whois.nic.travel/registered.txt +0 -75
- data/test/testcases/responses/whois.nic.tv/available.txt +0 -44
- data/test/testcases/responses/whois.nic.tv/registered.txt +0 -54
- data/test/testcases/responses/whois.nic.uk/available.txt +0 -20
- data/test/testcases/responses/whois.nic.uk/invalid.txt +0 -22
- data/test/testcases/responses/whois.nic.uk/registered.txt +0 -50
- data/test/testcases/responses/whois.nic.us/available.txt +0 -29
- data/test/testcases/responses/whois.nic.us/registered.txt +0 -99
- data/test/testcases/responses/whois.nic.ve/available.txt +0 -10
- data/test/testcases/responses/whois.nic.ve/registered.txt +0 -48
- data/test/testcases/responses/whois.norid.no/available.txt +0 -5
- data/test/testcases/responses/whois.norid.no/registered.txt +0 -34
- data/test/testcases/responses/whois.pandi.or.id/available.txt +0 -9
- data/test/testcases/responses/whois.pandi.or.id/registered.txt +0 -33
- data/test/testcases/responses/whois.publicinterestregistry.net/available.txt +0 -1
- data/test/testcases/responses/whois.publicinterestregistry.net/registered.txt +0 -85
- data/test/testcases/responses/whois.publicinterestregistry.net/throttle.txt +0 -1
- data/test/testcases/responses/whois.register.bg/available.txt +0 -1
- data/test/testcases/responses/whois.register.bg/property_nameservers_with_ip.txt +0 -42
- data/test/testcases/responses/whois.register.bg/registered.txt +0 -44
- data/test/testcases/responses/whois.registro.br/available.txt +0 -22
- data/test/testcases/responses/whois.registro.br/registered.txt +0 -23
- data/test/testcases/responses/whois.registry.in/available.txt +0 -1
- data/test/testcases/responses/whois.registry.in/registered.txt +0 -83
- data/test/testcases/responses/whois.registrypro.pro/available.txt +0 -20
- data/test/testcases/responses/whois.registrypro.pro/registered.txt +0 -62
- data/test/testcases/responses/whois.ripe.net/fo/available.txt +0 -11
- data/test/testcases/responses/whois.ripe.net/fo/registered.txt +0 -45
- data/test/testcases/responses/whois.ripe.net/gm/available.txt +0 -11
- data/test/testcases/responses/whois.ripe.net/gm/registered.txt +0 -37
- data/test/testcases/responses/whois.ripe.net/mc/available.txt +0 -11
- data/test/testcases/responses/whois.ripe.net/mc/registered.txt +0 -36
- data/test/testcases/responses/whois.ripe.net/sm/available.txt +0 -11
- data/test/testcases/responses/whois.ripe.net/sm/registered.txt +0 -60
- data/test/testcases/responses/whois.ripe.net/va/available.txt +0 -11
- data/test/testcases/responses/whois.ripe.net/va/registered.txt +0 -48
- data/test/testcases/responses/whois.ripn.net/ru/available.txt +0 -9
- data/test/testcases/responses/whois.ripn.net/ru/property_nameservers_with_ip.txt +0 -22
- data/test/testcases/responses/whois.ripn.net/ru/registered.txt +0 -24
- data/test/testcases/responses/whois.ripn.net/su/available.txt +0 -9
- data/test/testcases/responses/whois.ripn.net/su/registered.txt +0 -20
- data/test/testcases/responses/whois.rotld.ro/available.txt +0 -16
- data/test/testcases/responses/whois.rotld.ro/registered.txt +0 -27
- data/test/testcases/responses/whois.samoanic.ws/available.txt +0 -12
- data/test/testcases/responses/whois.samoanic.ws/registered.txt +0 -34
- data/test/testcases/responses/whois.srs.net.nz/available.txt +0 -28
- data/test/testcases/responses/whois.srs.net.nz/invalid.txt +0 -28
- data/test/testcases/responses/whois.srs.net.nz/registered.txt +0 -72
- data/test/testcases/responses/whois.tonic.to/1.txt +0 -1
- data/test/testcases/responses/whois.tonic.to/available.txt +0 -2
- data/test/testcases/responses/whois.tonic.to/incomplete.txt +0 -1
- data/test/testcases/responses/whois.tonic.to/registered.txt +0 -3
- data/test/testcases/responses/whois.za.net/available.txt +0 -9
- data/test/testcases/responses/whois.za.net/registered.txt +0 -42
- data/test/testcases/responses/whois.za.org/available.txt +0 -9
- data/test/testcases/responses/whois.za.org/registered.txt +0 -44
- data/test/whois/answer/contact_test.rb +0 -14
- data/test/whois/answer/parser/base_test.rb +0 -84
- data/test/whois/answer/parser/blank_test.rb +0 -19
- data/test/whois/answer/parser/jobswhois.verisign-grs.com_test.rb +0 -161
- data/test/whois/answer/parser/saudinic.net.sa_test.rb +0 -12
- data/test/whois/answer/parser/whois.adamsnames.tc_test.rb +0 -162
- data/test/whois/answer/parser/whois.aeda.net.ae_test.rb +0 -63
- data/test/whois/answer/parser/whois.aero_test.rb +0 -84
- data/test/whois/answer/parser/whois.afilias-grs.info_test.rb +0 -438
- data/test/whois/answer/parser/whois.afilias.info_test.rb +0 -64
- data/test/whois/answer/parser/whois.ai_test.rb +0 -58
- data/test/whois/answer/parser/whois.arnes.si_test.rb +0 -72
- data/test/whois/answer/parser/whois.audns.net.au_test.rb +0 -70
- data/test/whois/answer/parser/whois.ausregistry.net.au_test.rb +0 -12
- data/test/whois/answer/parser/whois.biz_test.rb +0 -64
- data/test/whois/answer/parser/whois.cat_test.rb +0 -64
- data/test/whois/answer/parser/whois.cctld.uz_test.rb +0 -91
- data/test/whois/answer/parser/whois.cira.ca_test.rb +0 -64
- data/test/whois/answer/parser/whois.cnnic.cn_test.rb +0 -73
- data/test/whois/answer/parser/whois.cnnic.net.cn_test.rb +0 -11
- data/test/whois/answer/parser/whois.crsnic.net_test.rb +0 -186
- data/test/whois/answer/parser/whois.denic.de_test.rb +0 -414
- data/test/whois/answer/parser/whois.dk-hostmaster.dk_test.rb +0 -57
- data/test/whois/answer/parser/whois.dns.be_test.rb +0 -65
- data/test/whois/answer/parser/whois.dns.lu_test.rb +0 -77
- data/test/whois/answer/parser/whois.dns.pt_test.rb +0 -84
- data/test/whois/answer/parser/whois.domain-registry.nl_test.rb +0 -62
- data/test/whois/answer/parser/whois.domainregistry.ie_test.rb +0 -60
- data/test/whois/answer/parser/whois.domreg.lt_test.rb +0 -67
- data/test/whois/answer/parser/whois.dot.tk_test.rb +0 -77
- data/test/whois/answer/parser/whois.dotmobiregistry.net_test.rb +0 -64
- data/test/whois/answer/parser/whois.educause.edu_test.rb +0 -64
- data/test/whois/answer/parser/whois.eenet.ee_test.rb +0 -91
- data/test/whois/answer/parser/whois.eu.org_test.rb +0 -51
- data/test/whois/answer/parser/whois.eu_test.rb +0 -65
- data/test/whois/answer/parser/whois.hkdnr.net.hk_test.rb +0 -77
- data/test/whois/answer/parser/whois.iana.org_test.rb +0 -63
- data/test/whois/answer/parser/whois.in.ua_test.rb +0 -91
- data/test/whois/answer/parser/whois.isnic.is_test.rb +0 -62
- data/test/whois/answer/parser/whois.jprs.jp_test.rb +0 -165
- data/test/whois/answer/parser/whois.meregistry.net_test.rb +0 -64
- data/test/whois/answer/parser/whois.museum_test.rb +0 -64
- data/test/whois/answer/parser/whois.net.ua_test.rb +0 -98
- data/test/whois/answer/parser/whois.nic-se.se_test.rb +0 -71
- data/test/whois/answer/parser/whois.nic.ac_test.rb +0 -126
- data/test/whois/answer/parser/whois.nic.af_test.rb +0 -84
- data/test/whois/answer/parser/whois.nic.ag_test.rb +0 -84
- data/test/whois/answer/parser/whois.nic.am_test.rb +0 -84
- data/test/whois/answer/parser/whois.nic.as_test.rb +0 -63
- data/test/whois/answer/parser/whois.nic.asia_test.rb +0 -69
- data/test/whois/answer/parser/whois.nic.at_test.rb +0 -65
- data/test/whois/answer/parser/whois.nic.cc_test.rb +0 -133
- data/test/whois/answer/parser/whois.nic.cd_test.rb +0 -62
- data/test/whois/answer/parser/whois.nic.ch_test.rb +0 -65
- data/test/whois/answer/parser/whois.nic.co_test.rb +0 -64
- data/test/whois/answer/parser/whois.nic.coop_test.rb +0 -64
- data/test/whois/answer/parser/whois.nic.ec_test.rb +0 -98
- data/test/whois/answer/parser/whois.nic.fr_test.rb +0 -281
- data/test/whois/answer/parser/whois.nic.gl_test.rb +0 -64
- data/test/whois/answer/parser/whois.nic.gov_test.rb +0 -51
- data/test/whois/answer/parser/whois.nic.ht_test.rb +0 -98
- data/test/whois/answer/parser/whois.nic.hu_test.rb +0 -321
- data/test/whois/answer/parser/whois.nic.im_test.rb +0 -60
- data/test/whois/answer/parser/whois.nic.io_test.rb +0 -51
- data/test/whois/answer/parser/whois.nic.it_test.rb +0 -298
- data/test/whois/answer/parser/whois.nic.kz_test.rb +0 -91
- data/test/whois/answer/parser/whois.nic.la_test.rb +0 -98
- data/test/whois/answer/parser/whois.nic.lv_test.rb +0 -65
- data/test/whois/answer/parser/whois.nic.ly_test.rb +0 -64
- data/test/whois/answer/parser/whois.nic.mu_test.rb +0 -123
- data/test/whois/answer/parser/whois.nic.mx_test.rb +0 -84
- data/test/whois/answer/parser/whois.nic.name_test.rb +0 -51
- data/test/whois/answer/parser/whois.nic.net.sa_test.rb +0 -84
- data/test/whois/answer/parser/whois.nic.nu_test.rb +0 -59
- data/test/whois/answer/parser/whois.nic.or.kr_test.rb +0 -64
- data/test/whois/answer/parser/whois.nic.org.uy_test.rb +0 -91
- data/test/whois/answer/parser/whois.nic.sn_test.rb +0 -190
- data/test/whois/answer/parser/whois.nic.st_test.rb +0 -77
- data/test/whois/answer/parser/whois.nic.tel_test.rb +0 -64
- data/test/whois/answer/parser/whois.nic.tl_test.rb +0 -84
- data/test/whois/answer/parser/whois.nic.tr_test.rb +0 -98
- data/test/whois/answer/parser/whois.nic.travel_test.rb +0 -64
- data/test/whois/answer/parser/whois.nic.tv_test.rb +0 -132
- data/test/whois/answer/parser/whois.nic.uk_test.rb +0 -76
- data/test/whois/answer/parser/whois.nic.us_test.rb +0 -64
- data/test/whois/answer/parser/whois.nic.ve_test.rb +0 -91
- data/test/whois/answer/parser/whois.norid.no_test.rb +0 -49
- data/test/whois/answer/parser/whois.pandi.or.id_test.rb +0 -79
- data/test/whois/answer/parser/whois.publicinterestregistry.net_test.rb +0 -284
- data/test/whois/answer/parser/whois.register.bg_test.rb +0 -69
- data/test/whois/answer/parser/whois.registro.br_test.rb +0 -51
- data/test/whois/answer/parser/whois.registry.in_test.rb +0 -69
- data/test/whois/answer/parser/whois.registrypro.pro_test.rb +0 -84
- data/test/whois/answer/parser/whois.ripe.net_test.rb +0 -266
- data/test/whois/answer/parser/whois.ripn.net_test.rb +0 -127
- data/test/whois/answer/parser/whois.rotld.ro_test.rb +0 -63
- data/test/whois/answer/parser/whois.samoanic.ws_test.rb +0 -64
- data/test/whois/answer/parser/whois.srs.net.nz_test.rb +0 -79
- data/test/whois/answer/parser/whois.tonic.to_test.rb +0 -125
- data/test/whois/answer/parser/whois.za.net_test.rb +0 -62
- data/test/whois/answer/parser/whois.za.org_test.rb +0 -62
- data/test/whois/answer/parser_test.rb +0 -219
- data/test/whois/answer/super_struct_test.rb +0 -24
- data/test/whois/answer_test.rb +0 -180
- data/test/whois/client_test.rb +0 -96
- data/test/whois/errors_test.rb +0 -23
- data/test/whois/integration_test.rb +0 -31
- data/test/whois/server/adapters/afilias_test.rb +0 -37
- data/test/whois/server/adapters/base_test.rb +0 -15
- data/test/whois/server/adapters/formatted_test.rb +0 -29
- data/test/whois/server/adapters/none_test.rb +0 -22
- data/test/whois/server/adapters/not_implemented_test.rb +0 -16
- data/test/whois/server/adapters/pir_test.rb +0 -37
- data/test/whois/server/adapters/standard_test.rb +0 -36
- data/test/whois/server/adapters/verisign_test.rb +0 -51
- data/test/whois/server/adapters/web_test.rb +0 -17
- data/test/whois/server_test.rb +0 -105
- data/utils/bm_delegation_vs_inheritance.rb +0 -150
- 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
|
-
|
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
|
140
|
-
|
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
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
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[
|
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
|
-
|
212
|
-
|
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
|
-
|
220
|
-
|
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
|
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 ||=
|
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 ||=
|
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 ||=
|
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
|
@@ -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
|
@@ -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
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
|
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
|
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
|
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
|
-
#
|
48
|
-
#
|
49
|
-
#
|
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
|
-
#
|
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
|
-
#
|
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
|
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
|
-
#
|
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
|
-
#
|
126
|
-
if
|
127
|
-
return
|
196
|
+
# Top Level Domain match
|
197
|
+
if matches_tld?(qstring)
|
198
|
+
return factory(:tld, ".", "whois.iana.org")
|
128
199
|
end
|
129
|
-
|
130
|
-
#
|
131
|
-
if
|
132
|
-
return
|
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
|
-
#
|
141
|
-
if server =
|
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.
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
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.
|
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
|
-
|
238
|
+
type = ip.ipv4? ? :ipv4 : :ipv6
|
239
|
+
definitions(type).each do |definition|
|
167
240
|
if IPAddr.new(definition.first).include?(ip)
|
168
|
-
return factory(
|
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
|
248
|
+
raise ServerNotSupported, "No WHOIS server is known for email objects"
|
178
249
|
end
|
179
250
|
|
180
|
-
def self.
|
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}
|