httpx/test/support/proxy_helper.rb
2022-08-04 14:01:47 +01:00

103 lines
2.6 KiB
Ruby

# frozen_string_literal: true
require "uri"
require "net/http"
require "oga"
module ProxyHelper
private
def socks4_proxy
Array(ENV["HTTPX_SOCKS4_PROXY"] || begin
socks_proxies_list.select { |_, _, version, https| version == "Socks4" && https }
.map { |ip, port, _, _| "socks4://#{ip}:#{port}" }
end)
end
def socks4a_proxy
Array(ENV["HTTPX_SOCKS4A_PROXY"] || begin
socks_proxies_list.select { |_, _, version, https| version == "Socks4" && https }
.map { |ip, port, _, _| "socks4a://#{ip}:#{port}" }
end)
end
def socks5_proxy
Array(ENV["HTTPX_SOCKS5_PROXY"] || begin
socks_proxies_list.select { |_, _, version, https| version == "Socks5" && https }
.map { |ip, port, _, _| "socks5://#{ip}:#{port}" }
end)
end
def http_proxy
Array(ENV["HTTPX_HTTP_PROXY"] || begin
http_proxies_list.map do |ip, port, _|
"http://#{ip}:#{port}"
end
end)
end
def http2_proxy
Array(ENV["HTTPX_HTTP2_PROXY"])
end
def https_proxy
Array(ENV["HTTPX_HTTPS_PROXY"] || begin
http_proxies_list.select { |_, _, https| https }.map do |ip, port, _|
"http://#{ip}:#{port}"
end
end)
end
def ssh_proxy
Array(ENV["HTTPX_SSH_PROXY"] || begin
http_proxies_list.select { |_, _, https| https }.map do |ip, port, _|
"ssh://#{ip}:#{port}"
end
end)
end
def http_proxies_list
proxies_list(parse_http_proxies)
.map do |line|
ip, port, _, _, _, _, https, _ = line.css("td").map(&:text)
[ip, port, https == "yes"]
end.select { |ip, port, _| ip && port } # rubocop:disable Style/MultilineBlockChain
end
def socks_proxies_list
proxies_list(parse_socks_proxies)
.map do |line|
ip, port, _, _, version, _, https, _ = line.css("td").map(&:text)
[ip, port, version, https == "Yes"]
end.select { |ip, port, _, _| ip && port } # rubocop:disable Style/MultilineBlockChain
end
def proxies_list(document)
row = document.enum_for(:each_node).find do |node|
next unless node.is_a?(Oga::XML::Element)
id = node.attribute("id")
next unless id
id.value == "list"
end
row ? row.css("tr") : []
end
def parse_http_proxies
@parse_http_proxies ||= Oga.parse_html(fetch_http_proxies)
end
def fetch_http_proxies
Net::HTTP.get_response(URI("https://www.sslproxies.org/")).body
end
def parse_socks_proxies
@parse_socks_proxies ||= Oga.parse_html(fetch_socks_proxies)
end
def fetch_socks_proxies
Net::HTTP.get_response(URI("https://www.socks-proxy.net/")).body
end
end