whois-parser-next 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +80 -0
- data/CODE_OF_CONDUCT.md +30 -0
- data/CONTRIBUTING.md +80 -0
- data/GOVERNANCE.md +59 -0
- data/LICENSE.txt +22 -0
- data/MAINTAINERS.md +44 -0
- data/README.md +123 -0
- data/RELEASING.md +43 -0
- data/ROADMAP.md +59 -0
- data/SECURITY.md +41 -0
- data/lib/whois/parser/contact.rb +56 -0
- data/lib/whois/parser/errors.rb +46 -0
- data/lib/whois/parser/nameserver.rb +39 -0
- data/lib/whois/parser/registrar.rb +25 -0
- data/lib/whois/parser/super_struct.rb +50 -0
- data/lib/whois/parser/version.rb +6 -0
- data/lib/whois/parser.rb +447 -0
- data/lib/whois/parser_extensions/whois.rb +83 -0
- data/lib/whois/parser_extensions/whois_parser.rb +24 -0
- data/lib/whois/parser_extensions/whois_record.rb +236 -0
- data/lib/whois/parser_extensions.rb +3 -0
- data/lib/whois/parsers/base.rb +413 -0
- data/lib/whois/parsers/base_afilias.rb +144 -0
- data/lib/whois/parsers/base_afilias2.rb +145 -0
- data/lib/whois/parsers/base_cocca.rb +97 -0
- data/lib/whois/parsers/base_cocca2.rb +93 -0
- data/lib/whois/parsers/base_icann_compliant.rb +158 -0
- data/lib/whois/parsers/base_icb.rb +51 -0
- data/lib/whois/parsers/base_iisse.rb +113 -0
- data/lib/whois/parsers/base_nic_fr.rb +175 -0
- data/lib/whois/parsers/base_shared1.rb +112 -0
- data/lib/whois/parsers/base_shared2.rb +130 -0
- data/lib/whois/parsers/base_shared3.rb +131 -0
- data/lib/whois/parsers/base_unsupported_registry.rb +30 -0
- data/lib/whois/parsers/base_verisign.rb +106 -0
- data/lib/whois/parsers/base_whoisd.rb +150 -0
- data/lib/whois/parsers/blank.rb +35 -0
- data/lib/whois/parsers/capetown-whois.registry.net.za.rb +25 -0
- data/lib/whois/parsers/ccwhois.ksregistry.net.rb +25 -0
- data/lib/whois/parsers/ccwhois.verisign-grs.com.rb +25 -0
- data/lib/whois/parsers/coza-whois.registry.net.za.rb +25 -0
- data/lib/whois/parsers/durban-whois.registry.net.za.rb +25 -0
- data/lib/whois/parsers/example.rb +163 -0
- data/lib/whois/parsers/joburg-whois.registry.net.za.rb +25 -0
- data/lib/whois/parsers/kero.yachay.pe.rb +97 -0
- data/lib/whois/parsers/org-whois.registry.net.za.rb +25 -0
- data/lib/whois/parsers/registry_response_safety.rb +29 -0
- data/lib/whois/parsers/tvwhois.verisign-grs.com.rb +25 -0
- data/lib/whois/parsers/vunic.vu.rb +11 -0
- data/lib/whois/parsers/whois.1und1.info.rb +28 -0
- data/lib/whois/parsers/whois.35.com.rb +23 -0
- data/lib/whois/parsers/whois.aeda.net.ae.rb +65 -0
- data/lib/whois/parsers/whois.aero.rb +58 -0
- data/lib/whois/parsers/whois.afilias-grs.info.rb +33 -0
- data/lib/whois/parsers/whois.afilias-srs.net.rb +16 -0
- data/lib/whois/parsers/whois.afilias.net.rb +41 -0
- data/lib/whois/parsers/whois.amnic.net.rb +81 -0
- data/lib/whois/parsers/whois.ascio.com.rb +29 -0
- data/lib/whois/parsers/whois.ati.tn.rb +120 -0
- data/lib/whois/parsers/whois.auda.org.au.rb +12 -0
- data/lib/whois/parsers/whois.audns.net.au.rb +118 -0
- data/lib/whois/parsers/whois.ax.rb +64 -0
- data/lib/whois/parsers/whois.biz.rb +34 -0
- data/lib/whois/parsers/whois.bnnic.bn.rb +77 -0
- data/lib/whois/parsers/whois.cat.rb +75 -0
- data/lib/whois/parsers/whois.cctld.by.rb +98 -0
- data/lib/whois/parsers/whois.cctld.uz.rb +83 -0
- data/lib/whois/parsers/whois.cdmon.com.rb +23 -0
- data/lib/whois/parsers/whois.centralnic.com.rb +144 -0
- data/lib/whois/parsers/whois.cira.ca.rb +227 -0
- data/lib/whois/parsers/whois.cmc.iq.rb +25 -0
- data/lib/whois/parsers/whois.cnnic.cn.rb +108 -0
- data/lib/whois/parsers/whois.co.ca.rb +74 -0
- data/lib/whois/parsers/whois.co.pl.rb +82 -0
- data/lib/whois/parsers/whois.co.ug.rb +93 -0
- data/lib/whois/parsers/whois.comlaude.com.rb +113 -0
- data/lib/whois/parsers/whois.corporatedomains.com.rb +28 -0
- data/lib/whois/parsers/whois.denic.de.rb +164 -0
- data/lib/whois/parsers/whois.dk-hostmaster.dk.rb +88 -0
- data/lib/whois/parsers/whois.dns.be.rb +120 -0
- data/lib/whois/parsers/whois.dns.hr.rb +119 -0
- data/lib/whois/parsers/whois.dns.lu.rb +125 -0
- data/lib/whois/parsers/whois.dns.pl.rb +151 -0
- data/lib/whois/parsers/whois.dns.pt.rb +92 -0
- data/lib/whois/parsers/whois.domain-registry.nl.rb +133 -0
- data/lib/whois/parsers/whois.domainregistry.ie.rb +128 -0
- data/lib/whois/parsers/whois.domreg.lt.rb +68 -0
- data/lib/whois/parsers/whois.donuts.co.rb +59 -0
- data/lib/whois/parsers/whois.dot.cf.rb +71 -0
- data/lib/whois/parsers/whois.dot.tk.rb +70 -0
- data/lib/whois/parsers/whois.dotgov.gov.rb +58 -0
- data/lib/whois/parsers/whois.dotmobiregistry.net.rb +21 -0
- data/lib/whois/parsers/whois.dotpostregistry.net.rb +25 -0
- data/lib/whois/parsers/whois.dreamhost.com.rb +23 -0
- data/lib/whois/parsers/whois.educause.edu.rb +198 -0
- data/lib/whois/parsers/whois.eenet.ee.rb +72 -0
- data/lib/whois/parsers/whois.enom.com.rb +34 -0
- data/lib/whois/parsers/whois.eu.org.rb +58 -0
- data/lib/whois/parsers/whois.eu.rb +130 -0
- data/lib/whois/parsers/whois.fi.rb +119 -0
- data/lib/whois/parsers/whois.gandi.net.rb +36 -0
- data/lib/whois/parsers/whois.gg.rb +93 -0
- data/lib/whois/parsers/whois.godaddy.com.rb +42 -0
- data/lib/whois/parsers/whois.gov.za.rb +60 -0
- data/lib/whois/parsers/whois.hkirc.hk.rb +71 -0
- data/lib/whois/parsers/whois.iana.org.rb +102 -0
- data/lib/whois/parsers/whois.id.rb +26 -0
- data/lib/whois/parsers/whois.iedr.ie.rb +18 -0
- data/lib/whois/parsers/whois.iis.nu.rb +46 -0
- data/lib/whois/parsers/whois.iis.se.rb +26 -0
- data/lib/whois/parsers/whois.in.ua.rb +75 -0
- data/lib/whois/parsers/whois.inregistry.net.rb +27 -0
- data/lib/whois/parsers/whois.isnic.is.rb +70 -0
- data/lib/whois/parsers/whois.isoc.org.il.rb +75 -0
- data/lib/whois/parsers/whois.ja.net.rb +75 -0
- data/lib/whois/parsers/whois.je.rb +75 -0
- data/lib/whois/parsers/whois.jprs.jp.rb +103 -0
- data/lib/whois/parsers/whois.kenic.or.ke.rb +93 -0
- data/lib/whois/parsers/whois.kg.rb +77 -0
- data/lib/whois/parsers/whois.kr.rb +79 -0
- data/lib/whois/parsers/whois.markmonitor.com.rb +36 -0
- data/lib/whois/parsers/whois.marnet.mk.rb +20 -0
- data/lib/whois/parsers/whois.monic.mo.rb +83 -0
- data/lib/whois/parsers/whois.museum.rb +79 -0
- data/lib/whois/parsers/whois.mx.rb +16 -0
- data/lib/whois/parsers/whois.mynic.my.rb +86 -0
- data/lib/whois/parsers/whois.na-nic.com.na.rb +21 -0
- data/lib/whois/parsers/whois.nc.rb +122 -0
- data/lib/whois/parsers/whois.netcom.cm.rb +54 -0
- data/lib/whois/parsers/whois.networksolutions.com.rb +37 -0
- data/lib/whois/parsers/whois.nic.ac.rb +33 -0
- data/lib/whois/parsers/whois.nic.af.rb +32 -0
- data/lib/whois/parsers/whois.nic.ag.rb +33 -0
- data/lib/whois/parsers/whois.nic.ai.rb +62 -0
- data/lib/whois/parsers/whois.nic.ar.rb +54 -0
- data/lib/whois/parsers/whois.nic.art.rb +9 -0
- data/lib/whois/parsers/whois.nic.as.rb +73 -0
- data/lib/whois/parsers/whois.nic.asia.rb +112 -0
- data/lib/whois/parsers/whois.nic.at.rb +68 -0
- data/lib/whois/parsers/whois.nic.best.rb +9 -0
- data/lib/whois/parsers/whois.nic.bj.rb +127 -0
- data/lib/whois/parsers/whois.nic.bo.rb +82 -0
- data/lib/whois/parsers/whois.nic.business.rb +8 -0
- data/lib/whois/parsers/whois.nic.cat.rb +23 -0
- data/lib/whois/parsers/whois.nic.cd.rb +38 -0
- data/lib/whois/parsers/whois.nic.cfd.rb +9 -0
- data/lib/whois/parsers/whois.nic.ch.rb +109 -0
- data/lib/whois/parsers/whois.nic.chat.rb +10 -0
- data/lib/whois/parsers/whois.nic.ci.rb +74 -0
- data/lib/whois/parsers/whois.nic.cl.rb +76 -0
- data/lib/whois/parsers/whois.nic.cloud.rb +15 -0
- data/lib/whois/parsers/whois.nic.club.rb +15 -0
- data/lib/whois/parsers/whois.nic.co.rb +25 -0
- data/lib/whois/parsers/whois.nic.college.rb +25 -0
- data/lib/whois/parsers/whois.nic.coop.rb +70 -0
- data/lib/whois/parsers/whois.nic.cr.rb +64 -0
- data/lib/whois/parsers/whois.nic.cx.rb +25 -0
- data/lib/whois/parsers/whois.nic.cz.rb +42 -0
- data/lib/whois/parsers/whois.nic.delivery.rb +9 -0
- data/lib/whois/parsers/whois.nic.design.rb +30 -0
- data/lib/whois/parsers/whois.nic.direct.rb +9 -0
- data/lib/whois/parsers/whois.nic.dm.rb +39 -0
- data/lib/whois/parsers/whois.nic.domains.rb +8 -0
- data/lib/whois/parsers/whois.nic.dz.rb +67 -0
- data/lib/whois/parsers/whois.nic.ec.rb +44 -0
- data/lib/whois/parsers/whois.nic.es.rb +114 -0
- data/lib/whois/parsers/whois.nic.fm.rb +18 -0
- data/lib/whois/parsers/whois.nic.fo.rb +69 -0
- data/lib/whois/parsers/whois.nic.fr.rb +25 -0
- data/lib/whois/parsers/whois.nic.fun.rb +13 -0
- data/lib/whois/parsers/whois.nic.games.rb +9 -0
- data/lib/whois/parsers/whois.nic.gd.rb +31 -0
- data/lib/whois/parsers/whois.nic.gl.rb +49 -0
- data/lib/whois/parsers/whois.nic.group.rb +8 -0
- data/lib/whois/parsers/whois.nic.gs.rb +31 -0
- data/lib/whois/parsers/whois.nic.hn.rb +49 -0
- data/lib/whois/parsers/whois.nic.host.rb +37 -0
- data/lib/whois/parsers/whois.nic.ht.rb +25 -0
- data/lib/whois/parsers/whois.nic.hu.rb +78 -0
- data/lib/whois/parsers/whois.nic.icu.rb +12 -0
- data/lib/whois/parsers/whois.nic.im.rb +66 -0
- data/lib/whois/parsers/whois.nic.ink.rb +12 -0
- data/lib/whois/parsers/whois.nic.io.rb +52 -0
- data/lib/whois/parsers/whois.nic.ir.rb +70 -0
- data/lib/whois/parsers/whois.nic.it.rb +159 -0
- data/lib/whois/parsers/whois.nic.jobs.rb +25 -0
- data/lib/whois/parsers/whois.nic.ki.rb +25 -0
- data/lib/whois/parsers/whois.nic.kz.rb +69 -0
- data/lib/whois/parsers/whois.nic.la.rb +32 -0
- data/lib/whois/parsers/whois.nic.li.rb +68 -0
- data/lib/whois/parsers/whois.nic.life.rb +10 -0
- data/lib/whois/parsers/whois.nic.link.rb +13 -0
- data/lib/whois/parsers/whois.nic.lk.rb +109 -0
- data/lib/whois/parsers/whois.nic.ltd.rb +8 -0
- data/lib/whois/parsers/whois.nic.lv.rb +69 -0
- data/lib/whois/parsers/whois.nic.ly.rb +78 -0
- data/lib/whois/parsers/whois.nic.market.rb +8 -0
- data/lib/whois/parsers/whois.nic.md.rb +101 -0
- data/lib/whois/parsers/whois.nic.me.rb +85 -0
- data/lib/whois/parsers/whois.nic.mg.rb +35 -0
- data/lib/whois/parsers/whois.nic.ms.rb +37 -0
- data/lib/whois/parsers/whois.nic.mu.rb +25 -0
- data/lib/whois/parsers/whois.nic.mw.rb +33 -0
- data/lib/whois/parsers/whois.nic.mx.rb +79 -0
- data/lib/whois/parsers/whois.nic.name.rb +68 -0
- data/lib/whois/parsers/whois.nic.net.bw.rb +11 -0
- data/lib/whois/parsers/whois.nic.net.ng.rb +27 -0
- data/lib/whois/parsers/whois.nic.net.sa.rb +74 -0
- data/lib/whois/parsers/whois.nic.net.sb.rb +35 -0
- data/lib/whois/parsers/whois.nic.news.rb +8 -0
- data/lib/whois/parsers/whois.nic.nf.rb +50 -0
- data/lib/whois/parsers/whois.nic.ninja.rb +8 -0
- data/lib/whois/parsers/whois.nic.one.rb +41 -0
- data/lib/whois/parsers/whois.nic.online.rb +39 -0
- data/lib/whois/parsers/whois.nic.org.uy.rb +75 -0
- data/lib/whois/parsers/whois.nic.plus.rb +8 -0
- data/lib/whois/parsers/whois.nic.pm.rb +25 -0
- data/lib/whois/parsers/whois.nic.pr.rb +84 -0
- data/lib/whois/parsers/whois.nic.priv.at.rb +62 -0
- data/lib/whois/parsers/whois.nic.pub.rb +8 -0
- data/lib/whois/parsers/whois.nic.pw.rb +25 -0
- data/lib/whois/parsers/whois.nic.re.rb +29 -0
- data/lib/whois/parsers/whois.nic.rocks.rb +8 -0
- data/lib/whois/parsers/whois.nic.run.rb +8 -0
- data/lib/whois/parsers/whois.nic.sh.rb +25 -0
- data/lib/whois/parsers/whois.nic.site.rb +62 -0
- data/lib/whois/parsers/whois.nic.sl.rb +80 -0
- data/lib/whois/parsers/whois.nic.sm.rb +84 -0
- data/lib/whois/parsers/whois.nic.sn.rb +119 -0
- data/lib/whois/parsers/whois.nic.so.rb +71 -0
- data/lib/whois/parsers/whois.nic.software.rb +9 -0
- data/lib/whois/parsers/whois.nic.solutions.rb +9 -0
- data/lib/whois/parsers/whois.nic.space.rb +25 -0
- data/lib/whois/parsers/whois.nic.st.rb +76 -0
- data/lib/whois/parsers/whois.nic.store.rb +15 -0
- data/lib/whois/parsers/whois.nic.studio.rb +8 -0
- data/lib/whois/parsers/whois.nic.systems.rb +8 -0
- data/lib/whois/parsers/whois.nic.tc.rb +25 -0
- data/lib/whois/parsers/whois.nic.tech.rb +33 -0
- data/lib/whois/parsers/whois.nic.technology.rb +8 -0
- data/lib/whois/parsers/whois.nic.tel.rb +25 -0
- data/lib/whois/parsers/whois.nic.tg.rb +49 -0
- data/lib/whois/parsers/whois.nic.tl.rb +32 -0
- data/lib/whois/parsers/whois.nic.tm.rb +101 -0
- data/lib/whois/parsers/whois.nic.today.rb +8 -0
- data/lib/whois/parsers/whois.nic.tools.rb +9 -0
- data/lib/whois/parsers/whois.nic.tr.rb +159 -0
- data/lib/whois/parsers/whois.nic.travel.rb +25 -0
- data/lib/whois/parsers/whois.nic.tv.rb +15 -0
- data/lib/whois/parsers/whois.nic.uk.rb +177 -0
- data/lib/whois/parsers/whois.nic.us.rb +25 -0
- data/lib/whois/parsers/whois.nic.ve.rb +94 -0
- data/lib/whois/parsers/whois.nic.vg.rb +16 -0
- data/lib/whois/parsers/whois.nic.video.rb +10 -0
- data/lib/whois/parsers/whois.nic.vip.rb +13 -0
- data/lib/whois/parsers/whois.nic.website.rb +9 -0
- data/lib/whois/parsers/whois.nic.wf.rb +29 -0
- data/lib/whois/parsers/whois.nic.win.rb +10 -0
- data/lib/whois/parsers/whois.nic.work.rb +10 -0
- data/lib/whois/parsers/whois.nic.works.rb +8 -0
- data/lib/whois/parsers/whois.nic.world.rb +10 -0
- data/lib/whois/parsers/whois.nic.xxx.rb +42 -0
- data/lib/whois/parsers/whois.nic.xyz.rb +25 -0
- data/lib/whois/parsers/whois.nixiregistry.in.rb +15 -0
- data/lib/whois/parsers/whois.norid.no.rb +61 -0
- data/lib/whois/parsers/whois.ovh.com.rb +12 -0
- data/lib/whois/parsers/whois.pairnic.com.rb +28 -0
- data/lib/whois/parsers/whois.pandi.or.id.rb +25 -0
- data/lib/whois/parsers/whois.pir.org.rb +90 -0
- data/lib/whois/parsers/whois.pnina.ps.rb +31 -0
- data/lib/whois/parsers/whois.register.bg.rb +86 -0
- data/lib/whois/parsers/whois.register.com.rb +30 -0
- data/lib/whois/parsers/whois.register.si.rb +73 -0
- data/lib/whois/parsers/whois.registre.ma.rb +65 -0
- data/lib/whois/parsers/whois.registro.br.rb +126 -0
- data/lib/whois/parsers/whois.registry.co.rb +19 -0
- data/lib/whois/parsers/whois.registry.gy.rb +32 -0
- data/lib/whois/parsers/whois.registry.hm.rb +72 -0
- data/lib/whois/parsers/whois.registry.om.rb +40 -0
- data/lib/whois/parsers/whois.registry.qa.rb +25 -0
- data/lib/whois/parsers/whois.ricta.org.rw.rb +16 -0
- data/lib/whois/parsers/whois.ripe.net.rb +68 -0
- data/lib/whois/parsers/whois.rnids.rs.rb +135 -0
- data/lib/whois/parsers/whois.rotld.ro.rb +65 -0
- data/lib/whois/parsers/whois.rrpproxy.net.rb +32 -0
- data/lib/whois/parsers/whois.safenames.net.rb +48 -0
- data/lib/whois/parsers/whois.schlund.info.rb +34 -0
- data/lib/whois/parsers/whois.sgnic.sg.rb +92 -0
- data/lib/whois/parsers/whois.sk-nic.sk.rb +111 -0
- data/lib/whois/parsers/whois.smallregistry.net.rb +131 -0
- data/lib/whois/parsers/whois.srs.net.nz.rb +177 -0
- data/lib/whois/parsers/whois.sx.rb +127 -0
- data/lib/whois/parsers/whois.tcinet.ru.rb +114 -0
- data/lib/whois/parsers/whois.thnic.co.th.rb +80 -0
- data/lib/whois/parsers/whois.tld.ee.rb +134 -0
- data/lib/whois/parsers/whois.tld.sy.rb +34 -0
- data/lib/whois/parsers/whois.tonic.to.rb +100 -0
- data/lib/whois/parsers/whois.tonicregistry.to.rb +12 -0
- data/lib/whois/parsers/whois.trabis.gov.tr.rb +58 -0
- data/lib/whois/parsers/whois.tucows.com.rb +28 -0
- data/lib/whois/parsers/whois.twnic.net.tw.rb +72 -0
- data/lib/whois/parsers/whois.tznic.or.tz.rb +36 -0
- data/lib/whois/parsers/whois.ua.rb +242 -0
- data/lib/whois/parsers/whois.udag.net.rb +28 -0
- data/lib/whois/parsers/whois.uniregistry.net.rb +71 -0
- data/lib/whois/parsers/whois.usp.ac.fj.rb +72 -0
- data/lib/whois/parsers/whois.verisign-grs.com.rb +49 -0
- data/lib/whois/parsers/whois.vunic.vu.rb +14 -0
- data/lib/whois/parsers/whois.website.ws.rb +79 -0
- data/lib/whois/parsers/whois.wildwestdomains.com.rb +37 -0
- data/lib/whois/parsers/whois.yoursrs.com.rb +125 -0
- data/lib/whois/parsers/whois.za.net.rb +72 -0
- data/lib/whois/parsers/whois.za.org.rb +72 -0
- data/lib/whois/parsers/whois.zicta.zm.rb +13 -0
- data/lib/whois/parsers/whois1.nic.bi.rb +25 -0
- data/lib/whois/parsers/za_central_registry.rb +80 -0
- data/lib/whois/parsers.rb +1 -0
- data/lib/whois/safe_record.rb +170 -0
- data/lib/whois/scanners/base.rb +114 -0
- data/lib/whois/scanners/base_afilias.rb +51 -0
- data/lib/whois/scanners/base_cocca2.rb +58 -0
- data/lib/whois/scanners/base_icann_compliant.rb +45 -0
- data/lib/whois/scanners/base_iisse.rb +36 -0
- data/lib/whois/scanners/base_shared1.rb +31 -0
- data/lib/whois/scanners/base_shared2.rb +35 -0
- data/lib/whois/scanners/base_shared3.rb +37 -0
- data/lib/whois/scanners/base_whoisd.rb +44 -0
- data/lib/whois/scanners/iana.rb +89 -0
- data/lib/whois/scanners/scannable.rb +65 -0
- data/lib/whois/scanners/verisign.rb +100 -0
- data/lib/whois/scanners/whois.ati.tn.rb +32 -0
- data/lib/whois/scanners/whois.audns.net.au.rb +32 -0
- data/lib/whois/scanners/whois.cctld.by.rb +35 -0
- data/lib/whois/scanners/whois.centralnic.com.rb +32 -0
- data/lib/whois/scanners/whois.cira.ca.rb +72 -0
- data/lib/whois/scanners/whois.cnnic.cn.rb +42 -0
- data/lib/whois/scanners/whois.denic.de.rb +103 -0
- data/lib/whois/scanners/whois.dns.hr.rb +30 -0
- data/lib/whois/scanners/whois.domainregistry.ie.rb +51 -0
- data/lib/whois/scanners/whois.fi.rb +66 -0
- data/lib/whois/scanners/whois.nc.rb +32 -0
- data/lib/whois/scanners/whois.nic.cz.rb +22 -0
- data/lib/whois/scanners/whois.nic.it.rb +92 -0
- data/lib/whois/scanners/whois.pir.org.rb +17 -0
- data/lib/whois/scanners/whois.rnids.rs.rb +52 -0
- data/lib/whois/scanners/whois.smallregistry.net.rb +50 -0
- data/lib/whois/scanners/whois.srs.net.nz.rb +23 -0
- data/lib/whois/scanners/whois.sx.rb +37 -0
- data/lib/whois/scanners/whois.tld.ee.rb +47 -0
- data/lib/whois/scanners/whois.tucows.com.rb +23 -0
- data/lib/whois/scanners/whois.yoursrs.com.rb +24 -0
- data/lib/whois-parser.rb +10 -0
- metadata +507 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Ruby Whois
|
|
3
|
+
#
|
|
4
|
+
# An intelligent pure Ruby WHOIS client and parser.
|
|
5
|
+
#
|
|
6
|
+
# Copyright (c) 2009-2022 Simone Carletti <weppos@weppos.net>
|
|
7
|
+
#++
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
require_relative 'base'
|
|
11
|
+
require 'whois/scanners/whois.yoursrs.com'
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
module Whois
|
|
15
|
+
class Parsers
|
|
16
|
+
|
|
17
|
+
# Parser for the whois.yoursrs.com server.
|
|
18
|
+
#
|
|
19
|
+
# @see Whois::Parsers::Example
|
|
20
|
+
# The Example parser for the list of all available methods.
|
|
21
|
+
#
|
|
22
|
+
class WhoisYoursrsCom < Base
|
|
23
|
+
include Scanners::Scannable
|
|
24
|
+
|
|
25
|
+
self.scanner = Scanners::WhoisYoursrsCom
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
property_supported :domain do
|
|
29
|
+
node("Domain Name", &:downcase)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
property_not_supported :domain_id
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
property_supported :status do
|
|
36
|
+
Array.wrap(node("Status"))
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
property_supported :available? do
|
|
40
|
+
!!node("status:available")
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
property_supported :registered? do
|
|
44
|
+
!available?
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
property_supported :created_on do
|
|
49
|
+
node("Created On") do |value|
|
|
50
|
+
parse_time(value)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
property_supported :updated_on do
|
|
55
|
+
node("Last Updated On") do |value|
|
|
56
|
+
parse_time(value)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
property_supported :expires_on do
|
|
61
|
+
node("Expiration Date") do |value|
|
|
62
|
+
parse_time(value)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
property_supported :registrar do
|
|
68
|
+
node("Sponsoring Registrar") do |value|
|
|
69
|
+
Parser::Registrar.new(
|
|
70
|
+
name: value
|
|
71
|
+
)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
property_supported :registrant_contacts do
|
|
77
|
+
build_contact("Registrant", Parser::Contact::TYPE_REGISTRANT)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
property_supported :admin_contacts do
|
|
81
|
+
build_contact("ADMIN", Parser::Contact::TYPE_ADMINISTRATIVE)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
property_supported :technical_contacts do
|
|
85
|
+
build_contact("TECH", Parser::Contact::TYPE_TECHNICAL)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
property_supported :nameservers do
|
|
90
|
+
Array.wrap(node("Name Server")).reject(&:empty?).map do |name|
|
|
91
|
+
Parser::Nameserver.new(name: name.downcase)
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
private
|
|
97
|
+
|
|
98
|
+
def build_contact(element, type)
|
|
99
|
+
node("#{element} ID") do
|
|
100
|
+
address = (1..3)
|
|
101
|
+
.map { |i| node("#{element} Street#{i}") }
|
|
102
|
+
.delete_if { |i| i.nil? || i.empty? }
|
|
103
|
+
.join("\n")
|
|
104
|
+
|
|
105
|
+
Parser::Contact.new(
|
|
106
|
+
type: type,
|
|
107
|
+
id: node("#{element} ID"),
|
|
108
|
+
name: node("#{element} Name"),
|
|
109
|
+
organization: node("#{element} Organization"),
|
|
110
|
+
address: address,
|
|
111
|
+
city: node("#{element} City"),
|
|
112
|
+
zip: node("#{element} Postal Code"),
|
|
113
|
+
state: node("#{element} State"),
|
|
114
|
+
country_code: node("#{element} Country"),
|
|
115
|
+
phone: node("#{element} Phone"),
|
|
116
|
+
fax: node("#{element} Fax"),
|
|
117
|
+
email: node("#{element} Email")
|
|
118
|
+
)
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
end
|
|
125
|
+
end
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Ruby Whois
|
|
3
|
+
#
|
|
4
|
+
# An intelligent pure Ruby WHOIS client and parser.
|
|
5
|
+
#
|
|
6
|
+
# Copyright (c) 2009-2022 Simone Carletti <weppos@weppos.net>
|
|
7
|
+
#++
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
require_relative 'base'
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
module Whois
|
|
14
|
+
class Parsers
|
|
15
|
+
|
|
16
|
+
#
|
|
17
|
+
# = whois.za.net parser
|
|
18
|
+
#
|
|
19
|
+
# Parser for the whois.za.net server.
|
|
20
|
+
#
|
|
21
|
+
# NOTE: This parser is just a stub and provides only a few basic methods
|
|
22
|
+
# to check for domain availability and get domain status.
|
|
23
|
+
# Please consider to contribute implementing missing methods.
|
|
24
|
+
# See WhoisNicIt parser for an explanation of all available methods
|
|
25
|
+
# and examples.
|
|
26
|
+
#
|
|
27
|
+
class WhoisZaNet < Base
|
|
28
|
+
|
|
29
|
+
property_supported :status do
|
|
30
|
+
if available?
|
|
31
|
+
:available
|
|
32
|
+
else
|
|
33
|
+
:registered
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
property_supported :available? do
|
|
38
|
+
!!(content_for_scanner =~ /No such domain:/)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
property_supported :registered? do
|
|
42
|
+
!available?
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
property_supported :created_on do
|
|
47
|
+
if content_for_scanner =~ /Record Created\s+:\s+(.*)\n/
|
|
48
|
+
parse_time(::Regexp.last_match(1))
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
property_supported :updated_on do
|
|
53
|
+
if content_for_scanner =~ /Record Last Updated\s+:\s+(.*)\n/
|
|
54
|
+
parse_time(::Regexp.last_match(1))
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
property_not_supported :expires_on
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
property_supported :nameservers do
|
|
62
|
+
if content_for_scanner =~ /Domain Name Servers listed in order:\n\n((.+\n)+)\n/
|
|
63
|
+
::Regexp.last_match(1).split("\n").reject { |value| value.strip.empty? }.map do |name|
|
|
64
|
+
Parser::Nameserver.new(:name => name.strip)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
end
|
|
72
|
+
end
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Ruby Whois
|
|
3
|
+
#
|
|
4
|
+
# An intelligent pure Ruby WHOIS client and parser.
|
|
5
|
+
#
|
|
6
|
+
# Copyright (c) 2009-2022 Simone Carletti <weppos@weppos.net>
|
|
7
|
+
#++
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
require_relative 'base'
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
module Whois
|
|
14
|
+
class Parsers
|
|
15
|
+
|
|
16
|
+
#
|
|
17
|
+
# = whois.za.org parser
|
|
18
|
+
#
|
|
19
|
+
# Parser for the whois.za.org server.
|
|
20
|
+
#
|
|
21
|
+
# NOTE: This parser is just a stub and provides only a few basic methods
|
|
22
|
+
# to check for domain availability and get domain status.
|
|
23
|
+
# Please consider to contribute implementing missing methods.
|
|
24
|
+
# See WhoisNicIt parser for an explanation of all available methods
|
|
25
|
+
# and examples.
|
|
26
|
+
#
|
|
27
|
+
class WhoisZaOrg < Base
|
|
28
|
+
|
|
29
|
+
property_supported :status do
|
|
30
|
+
if available?
|
|
31
|
+
:available
|
|
32
|
+
else
|
|
33
|
+
:registered
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
property_supported :available? do
|
|
38
|
+
!!(content_for_scanner =~ /No such domain:/)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
property_supported :registered? do
|
|
42
|
+
!available?
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
property_supported :created_on do
|
|
47
|
+
if content_for_scanner =~ /Record Created\s+:\s+(.*)\n/
|
|
48
|
+
parse_time(::Regexp.last_match(1))
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
property_supported :updated_on do
|
|
53
|
+
if content_for_scanner =~ /Record Last Updated\s+:\s+(.*)\n/
|
|
54
|
+
parse_time(::Regexp.last_match(1))
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
property_not_supported :expires_on
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
property_supported :nameservers do
|
|
62
|
+
if content_for_scanner =~ /Domain Name Servers listed in order:\n\n((.+\n)+)\n/
|
|
63
|
+
::Regexp.last_match(1).split("\n").reject { |value| value.strip.empty? }.map do |name|
|
|
64
|
+
Parser::Nameserver.new(:name => name.strip)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
end
|
|
72
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
require_relative 'base_icann_compliant'
|
|
2
|
+
|
|
3
|
+
module Whois
|
|
4
|
+
class Parsers
|
|
5
|
+
# ZICTA's current endpoint uses ICANN key/value fields and the CoCCA-style
|
|
6
|
+
# no-object marker for an absent name.
|
|
7
|
+
class WhoisZictaZm < BaseIcannCompliant
|
|
8
|
+
self.scanner = Scanners::BaseIcannCompliant, {
|
|
9
|
+
pattern_available: /^The queried object does not exist: No Object Found\s*$/i,
|
|
10
|
+
}
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Ruby Whois
|
|
3
|
+
#
|
|
4
|
+
# An intelligent pure Ruby WHOIS client and parser.
|
|
5
|
+
#
|
|
6
|
+
# Copyright (c) 2009-2022 Simone Carletti <weppos@weppos.net>
|
|
7
|
+
#++
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
require_relative 'base_cocca2'
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
module Whois
|
|
14
|
+
class Parsers
|
|
15
|
+
|
|
16
|
+
# Parser for the whois1.nic.bi server.
|
|
17
|
+
#
|
|
18
|
+
# @see Whois::Parsers::Example
|
|
19
|
+
# The Example parser for the list of all available methods.
|
|
20
|
+
#
|
|
21
|
+
class Whois1NicBi < BaseCocca2
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
#--
|
|
2
|
+
# Ruby Whois
|
|
3
|
+
#
|
|
4
|
+
# An intelligent pure Ruby WHOIS client and parser.
|
|
5
|
+
#
|
|
6
|
+
# Copyright (c) 2009-2022 Simone Carletti <weppos@weppos.net>
|
|
7
|
+
#++
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
require_relative 'base_icann_compliant'
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
module Whois
|
|
14
|
+
class Parsers
|
|
15
|
+
|
|
16
|
+
# Parser for the ZA Central Registry servers.
|
|
17
|
+
#
|
|
18
|
+
class ZaCentralRegistry < BaseIcannCompliant
|
|
19
|
+
|
|
20
|
+
property_supported :domain_id do
|
|
21
|
+
node('Domain ID')
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
property_supported :expires_on do
|
|
25
|
+
node('Registry Expiry Date') do |value|
|
|
26
|
+
parse_time(value)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
property_supported :registrar do
|
|
31
|
+
return unless node("Sponsoring Registrar")
|
|
32
|
+
|
|
33
|
+
Parser::Registrar.new(
|
|
34
|
+
id: node('Sponsoring Registrar IANA ID'),
|
|
35
|
+
name: node('Sponsoring Registrar'),
|
|
36
|
+
organization: node('Sponsoring Registrar')
|
|
37
|
+
)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
property_supported :available? do
|
|
41
|
+
!node("Creation Date")
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Checks whether the response has been throttled.
|
|
45
|
+
#
|
|
46
|
+
# @return [Boolean]
|
|
47
|
+
#
|
|
48
|
+
# @example
|
|
49
|
+
# Please go away for 13 Seconds
|
|
50
|
+
#
|
|
51
|
+
def response_throttled?
|
|
52
|
+
!!(content_for_scanner =~ /Please go away for \d+ [Ss]econds/)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
private
|
|
57
|
+
|
|
58
|
+
def build_contact(element, type)
|
|
59
|
+
node("#{element} Name") do
|
|
60
|
+
Parser::Contact.new(
|
|
61
|
+
type: type,
|
|
62
|
+
id: node("#{element} ID").presence,
|
|
63
|
+
name: value_for_property(element, 'Name'),
|
|
64
|
+
organization: value_for_property(element, 'Organization'),
|
|
65
|
+
address: value_for_property(element, 'Street'),
|
|
66
|
+
city: value_for_property(element, 'City'),
|
|
67
|
+
zip: value_for_property(element, 'Postal Code'),
|
|
68
|
+
state: value_for_property(element, 'State/Province'),
|
|
69
|
+
country_code: value_for_property(element, 'Country'),
|
|
70
|
+
phone: value_for_phone_property(element, 'Phone'),
|
|
71
|
+
fax: value_for_phone_property(element, 'Fax'),
|
|
72
|
+
email: value_for_property(element, 'Email')
|
|
73
|
+
)
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
end
|
|
80
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require_relative 'parsers/base'
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
require_relative 'parser'
|
|
2
|
+
|
|
3
|
+
module Whois
|
|
4
|
+
class SafeRecord < BasicObject
|
|
5
|
+
|
|
6
|
+
# @api private
|
|
7
|
+
def self.define_property_method(method)
|
|
8
|
+
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
|
9
|
+
def #{method}(*args, &block)
|
|
10
|
+
if property_any_supported?(:#{method})
|
|
11
|
+
parser.#{method}(*args, &block)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
RUBY
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# @api private
|
|
18
|
+
def self.define_method_method(method)
|
|
19
|
+
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
|
20
|
+
def #{method}(*args, &block)
|
|
21
|
+
if parser.respond_to?(:#{method})
|
|
22
|
+
parser.#{method}(*args, &block)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
RUBY
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# @api private
|
|
29
|
+
def self.define_question_method(method)
|
|
30
|
+
return if method.to_s.end_with?("?")
|
|
31
|
+
|
|
32
|
+
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
|
33
|
+
def #{method}?
|
|
34
|
+
!#{method}.nil?
|
|
35
|
+
end
|
|
36
|
+
RUBY
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
Parser::PROPERTIES.each do |method|
|
|
40
|
+
define_property_method(method)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
Parser::METHODS.each do |method|
|
|
44
|
+
define_method_method(method)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
(Parser::PROPERTIES + Parser::METHODS).each do |method|
|
|
48
|
+
define_question_method(method)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
attr_reader :record
|
|
53
|
+
|
|
54
|
+
def initialize(record)
|
|
55
|
+
@record = record
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
alias target record
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
# Checks if this class respond to given method.
|
|
62
|
+
#
|
|
63
|
+
# Overrides the default implementation to add support
|
|
64
|
+
# for {Whois::Parser::PROPERTIES} and {Whois::Parser::METHODS}.
|
|
65
|
+
#
|
|
66
|
+
# @return [Boolean]
|
|
67
|
+
#
|
|
68
|
+
def respond_to?(*args)
|
|
69
|
+
respond_to_parser_method?(args.first) || target.respond_to?(*args)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
# Lazy-loads and returns the parser proxy for current record.
|
|
74
|
+
#
|
|
75
|
+
# @return [Whois::Parser]
|
|
76
|
+
def parser
|
|
77
|
+
@parser ||= Parser.new(record)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Returns a Hash containing all supported properties for this record
|
|
81
|
+
# along with corresponding values.
|
|
82
|
+
#
|
|
83
|
+
# @return [{ Symbol => Object }]
|
|
84
|
+
def properties
|
|
85
|
+
hash = {}
|
|
86
|
+
Parser::PROPERTIES.each do |property|
|
|
87
|
+
hash[property] = __send__(property)
|
|
88
|
+
end
|
|
89
|
+
hash
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# Shortcut for <tt>#registrant_contacts.first</tt>.
|
|
93
|
+
#
|
|
94
|
+
# @see Whois::Parser#registrant_contacts
|
|
95
|
+
#
|
|
96
|
+
# @return [Whois::Parser::Contact]
|
|
97
|
+
# If the property is supported and a contact exists.
|
|
98
|
+
# @return [nil]
|
|
99
|
+
# If the property is not supported or the contact doesn't exist.
|
|
100
|
+
def registrant_contact
|
|
101
|
+
if property_any_supported?(:registrant_contacts)
|
|
102
|
+
registrant_contacts.first
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# Shortcut for <tt>#admin_contacts.first</tt>.
|
|
107
|
+
#
|
|
108
|
+
# @see Whois::Parser#admin_contacts
|
|
109
|
+
#
|
|
110
|
+
# @return [Whois::Parser::Contact]
|
|
111
|
+
# If the property is supported and a contact exists.
|
|
112
|
+
# @return [nil]
|
|
113
|
+
# If the property is not supported or the contact doesn't exist.
|
|
114
|
+
def admin_contact
|
|
115
|
+
if property_any_supported?(:admin_contacts)
|
|
116
|
+
admin_contacts.first
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# Shortcut for <tt>#technical_contacts.first</tt>.
|
|
121
|
+
#
|
|
122
|
+
# @see Whois::Parser#technical_contacts
|
|
123
|
+
#
|
|
124
|
+
# @return [Whois::Parser::Contact]
|
|
125
|
+
# If the property is supported and a contact exists.
|
|
126
|
+
# @return [nil]
|
|
127
|
+
# If the property is not supported or the contact doesn't exist.
|
|
128
|
+
def technical_contact
|
|
129
|
+
if property_any_supported?(:technical_contacts)
|
|
130
|
+
technical_contacts.first
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# Collects and returns all the contacts.
|
|
135
|
+
#
|
|
136
|
+
# @see Whois::Parser#contacts
|
|
137
|
+
#
|
|
138
|
+
# @return [Array<Whois::Parser::Contact>]
|
|
139
|
+
def contacts
|
|
140
|
+
parser.contacts
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
private
|
|
145
|
+
|
|
146
|
+
# @api private
|
|
147
|
+
def respond_to_parser_method?(symbol)
|
|
148
|
+
name = symbol.to_s =~ /\?$/ ? symbol.to_s[0..-2] : symbol
|
|
149
|
+
Parser::PROPERTIES.include?(name.to_sym) || Parser::METHODS.include?(name.to_sym)
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
# Checks if the property passed as symbol
|
|
153
|
+
# is supported in any of the parsers.
|
|
154
|
+
#
|
|
155
|
+
# @api private
|
|
156
|
+
# @see Whois::Parser::Parser#property_any_supported?
|
|
157
|
+
#
|
|
158
|
+
# @param [Symbol] property The name of the property to check.
|
|
159
|
+
# @return [Boolean]
|
|
160
|
+
def property_any_supported?(property)
|
|
161
|
+
parser.property_any_supported?(property)
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
# Delegates any missing method to Record.
|
|
165
|
+
def method_missing(method, *args, &block)
|
|
166
|
+
target.send(method, *args, &block)
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
end
|
|
170
|
+
end
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
module Whois
|
|
2
|
+
module Scanners
|
|
3
|
+
|
|
4
|
+
class Base
|
|
5
|
+
|
|
6
|
+
class_attribute :tokenizers
|
|
7
|
+
self.tokenizers = []
|
|
8
|
+
|
|
9
|
+
def self.tokenizer(name, &block)
|
|
10
|
+
define_method(name, &block)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
attr_reader :settings
|
|
15
|
+
|
|
16
|
+
def initialize(settings = nil)
|
|
17
|
+
@settings = settings || {}
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def parse(content)
|
|
21
|
+
# The temporary store.
|
|
22
|
+
# Scanners may use this to store pointers, states or other flags.
|
|
23
|
+
@tmp = {}
|
|
24
|
+
|
|
25
|
+
# A super-simple AST store.
|
|
26
|
+
@ast = {}
|
|
27
|
+
|
|
28
|
+
@input = StringScanner.new(content)
|
|
29
|
+
tokenize until @input.eos?
|
|
30
|
+
|
|
31
|
+
@ast
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
tokenizer :skip_empty_line do
|
|
36
|
+
@input.skip(/^\n/)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
tokenizer :skip_blank_line do
|
|
40
|
+
@input.skip(/^\s*\n/)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
tokenizer :skip_newline do
|
|
44
|
+
@input.skip(/\n/)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Scan a key/value pair and stores the result in the current target.
|
|
48
|
+
# target is the global @ast if no '_section' is set, else '_section' is used.
|
|
49
|
+
tokenizer :scan_keyvalue do
|
|
50
|
+
if @input.scan(/(.+?):(.*?)(\n|\z)/)
|
|
51
|
+
key, value = @input[1].strip, @input[2].strip
|
|
52
|
+
target = @tmp['_section'] ? (@ast[@tmp['_section']] ||= {}) : @ast
|
|
53
|
+
|
|
54
|
+
if target[key].nil?
|
|
55
|
+
target[key] = value
|
|
56
|
+
else
|
|
57
|
+
target[key] = Array.wrap(target[key])
|
|
58
|
+
target[key] << value
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
protected
|
|
64
|
+
|
|
65
|
+
def _scan_lines_to_array(pattern)
|
|
66
|
+
results = []
|
|
67
|
+
while @input.scan(pattern)
|
|
68
|
+
@input[1].strip
|
|
69
|
+
results << @input[1].strip
|
|
70
|
+
end
|
|
71
|
+
results
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def _scan_lines_to_hash(pattern)
|
|
75
|
+
results = {}
|
|
76
|
+
results.merge! @input[1].strip => @input[2].strip while @input.scan(pattern)
|
|
77
|
+
results
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def _scan_keyvalues(pattern)
|
|
81
|
+
results = []
|
|
82
|
+
while @input.scan(/(.+?):(.*?)\n/)
|
|
83
|
+
key, value = @input[1].strip, @input[2].strip
|
|
84
|
+
if results[key].nil?
|
|
85
|
+
results[key] = value
|
|
86
|
+
else
|
|
87
|
+
results[key] = Array.wrap(results[key])
|
|
88
|
+
results[key] << value
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
private
|
|
95
|
+
|
|
96
|
+
def tokenize
|
|
97
|
+
tokenizers.each do |tokenizer|
|
|
98
|
+
return if send(tokenizer)
|
|
99
|
+
end
|
|
100
|
+
unexpected_token
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def unexpected_token
|
|
104
|
+
error!("Unexpected token")
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def error!(message)
|
|
108
|
+
raise ParserError, "#{message}: #{@input.peek(@input.string.length)}"
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
end
|
|
114
|
+
end
|