# frozen_string_literal: true module ProxyFetcher module Providers # HTTPTunnel provider class. class HTTPTunnel < Base # Provider URL to fetch proxy list def provider_url "http://www.httptunnel.ge/ProxyListForFree.aspx" end def xpath '//table[contains(@id, "GridView")]/tr[(count(td)>2)]' end # Converts HTML node (entry of N tags) to ProxyFetcher::Proxy # object. # # @param html_node [Object] # HTML node from the ProxyFetcher::Document DOM model. # # @return [ProxyFetcher::Proxy] # Proxy object # def to_proxy(html_node) ProxyFetcher::Proxy.new.tap do |proxy| uri = parse_proxy_uri(html_node) proxy.addr = uri.host proxy.port = uri.port proxy.country = parse_country(html_node) proxy.anonymity = parse_anonymity(html_node) proxy.type = ProxyFetcher::Proxy::HTTP end end private # Parses HTML node to extract URI object with proxy host and port. # # @param html_node [Object] # HTML node from the ProxyFetcher::Document DOM model. # # @return [URI] # URI object # def parse_proxy_uri(html_node) full_addr = html_node.content_at("td[1]") URI.parse("http://#{full_addr}") end # Parses HTML node to extract proxy country. # # @param html_node [Object] # HTML node from the ProxyFetcher::Document DOM model. # # @return [String] # Country code # def parse_country(html_node) html_node.find(".//img").attr("title") end # Parses HTML node to extract proxy anonymity level. # # @param html_node [Object] # HTML node from the ProxyFetcher::Document DOM model. # # @return [String] # Anonymity level # def parse_anonymity(html_node) transparency = html_node.content_at("td[5]").to_sym { A: "Anonymous", E: "Elite", T: "Transparent", U: "Unknown" }.fetch(transparency, "Unknown") end end ProxyFetcher::Configuration.register_provider(:http_tunnel, HTTPTunnel) end end