From 2e65e1c6fd0e874250106cecf27925989051cf4f Mon Sep 17 00:00:00 2001 From: rick olson Date: Thu, 13 Jun 2019 10:25:00 -0600 Subject: [PATCH 1/8] patch in socks support for net/http adapter --- lib/faraday/adapter/net_http.rb | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/lib/faraday/adapter/net_http.rb b/lib/faraday/adapter/net_http.rb index d5c0061d0..026aea937 100644 --- a/lib/faraday/adapter/net_http.rb +++ b/lib/faraday/adapter/net_http.rb @@ -7,6 +7,13 @@ 'Make sure openssl is installed if you want ssl support' require 'net/http' end + +begin + require "socksify/http" +rescue LoadError + # socksify is optional +end + require 'zlib' module Faraday @@ -140,8 +147,7 @@ def with_net_http_connection(env) def net_http_connection(env) klass = if (proxy = env[:request][:proxy]) - Net::HTTP::Proxy(proxy[:uri].hostname, proxy[:uri].port, - proxy[:user], proxy[:password]) + proxy_class(proxy) else Net::HTTP end @@ -149,6 +155,21 @@ def net_http_connection(env) klass.new(env[:url].hostname, port) end + def proxy_class(proxy) + if proxy.uri.scheme != "socks" + return Net::HTTP::Proxy( + proxy[:uri].host, + proxy[:uri].port, + proxy[:uri].user, + proxy[:uri].password, + ) + end + + TCPSocket.socks_username = proxy[:user] if proxy[:user] + TCPSocket.socks_password = proxy[:password] if proxy[:password] + Net::HTTP::SOCKSProxy(proxy[:uri].host, proxy[:uri].port) + end + def configure_ssl(http, ssl) http.use_ssl = true http.verify_mode = ssl_verify_mode(ssl) From c7f5bb312f3e9f007360d1e8a620487214ac8651 Mon Sep 17 00:00:00 2001 From: rick olson Date: Thu, 13 Jun 2019 10:41:18 -0600 Subject: [PATCH 2/8] raise a more descriptive error --- lib/faraday/adapter/net_http.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/faraday/adapter/net_http.rb b/lib/faraday/adapter/net_http.rb index 026aea937..7e756ee2b 100644 --- a/lib/faraday/adapter/net_http.rb +++ b/lib/faraday/adapter/net_http.rb @@ -168,6 +168,11 @@ def proxy_class(proxy) TCPSocket.socks_username = proxy[:user] if proxy[:user] TCPSocket.socks_password = proxy[:password] if proxy[:password] Net::HTTP::SOCKSProxy(proxy[:uri].host, proxy[:uri].port) + rescue NoMethodError => err + if err.to_s =~ /socks/i + raise "SOCKS proxy support requires the socksify gem ~> 1.7.1" + end + raise end def configure_ssl(http, ssl) From 347e7995aa9c4085e3b5532b1cce2d40ca2df956 Mon Sep 17 00:00:00 2001 From: rick olson Date: Thu, 13 Jun 2019 10:59:37 -0600 Subject: [PATCH 3/8] break up #proxy_class into #http_proxy and #socks_proxy --- lib/faraday/adapter/net_http.rb | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/lib/faraday/adapter/net_http.rb b/lib/faraday/adapter/net_http.rb index 7e756ee2b..5dd32d1b1 100644 --- a/lib/faraday/adapter/net_http.rb +++ b/lib/faraday/adapter/net_http.rb @@ -146,25 +146,28 @@ def with_net_http_connection(env) end def net_http_connection(env) - klass = if (proxy = env[:request][:proxy]) - proxy_class(proxy) - else + proxy = env[:request][:proxy] + klass = if proxy.nil? Net::HTTP + elsif proxy.uri.scheme != 'socks' + http_proxy(proxy) + else + socks_proxy(proxy) end port = env[:url].port || (env[:url].scheme == 'https' ? 443 : 80) klass.new(env[:url].hostname, port) end - def proxy_class(proxy) - if proxy.uri.scheme != "socks" - return Net::HTTP::Proxy( - proxy[:uri].host, - proxy[:uri].port, - proxy[:uri].user, - proxy[:uri].password, - ) - end + def http_proxy(proxy) + Net::HTTP::Proxy( + proxy[:uri].host, + proxy[:uri].port, + proxy[:uri].user, + proxy[:uri].password, + ) + end + def socks_proxy(proxy) TCPSocket.socks_username = proxy[:user] if proxy[:user] TCPSocket.socks_password = proxy[:password] if proxy[:password] Net::HTTP::SOCKSProxy(proxy[:uri].host, proxy[:uri].port) From c470fcabb322e3b382d87c64248482b6d5754336 Mon Sep 17 00:00:00 2001 From: rick olson Date: Thu, 13 Jun 2019 11:06:09 -0600 Subject: [PATCH 4/8] support socksify api introduced in https://github.com/astro/socksify-ruby/pull/33 --- lib/faraday/adapter/net_http.rb | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/lib/faraday/adapter/net_http.rb b/lib/faraday/adapter/net_http.rb index 5dd32d1b1..0ecc88a0e 100644 --- a/lib/faraday/adapter/net_http.rb +++ b/lib/faraday/adapter/net_http.rb @@ -146,18 +146,17 @@ def with_net_http_connection(env) end def net_http_connection(env) - proxy = env[:request][:proxy] - klass = if proxy.nil? - Net::HTTP - elsif proxy.uri.scheme != 'socks' - http_proxy(proxy) - else - socks_proxy(proxy) - end + klass = proxy_class(env[:request][:proxy]) port = env[:url].port || (env[:url].scheme == 'https' ? 443 : 80) klass.new(env[:url].hostname, port) end + def proxy_class(proxy) + return Net::HTTP if proxy.nil? + return http_proxy(proxy) unless proxy.uri.scheme != 'socks' + socks_proxy(proxy) + end + def http_proxy(proxy) Net::HTTP::Proxy( proxy[:uri].host, @@ -168,14 +167,12 @@ def http_proxy(proxy) end def socks_proxy(proxy) - TCPSocket.socks_username = proxy[:user] if proxy[:user] - TCPSocket.socks_password = proxy[:password] if proxy[:password] - Net::HTTP::SOCKSProxy(proxy[:uri].host, proxy[:uri].port) - rescue NoMethodError => err - if err.to_s =~ /socks/i + if !Net::HTTP.respond_to?(:SOCKSProxy) raise "SOCKS proxy support requires the socksify gem ~> 1.7.1" end - raise + + Net::HTTP::SOCKSProxy(proxy[:uri].host, proxy[:uri].port, + proxy[:user], proxy[:password]) end def configure_ssl(http, ssl) From 31758a0ce48527694580138a760ee85f4684e0c8 Mon Sep 17 00:00:00 2001 From: rick olson Date: Thu, 13 Jun 2019 11:09:52 -0600 Subject: [PATCH 5/8] lint --- lib/faraday/adapter/net_http.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/faraday/adapter/net_http.rb b/lib/faraday/adapter/net_http.rb index 0ecc88a0e..08eb41e70 100644 --- a/lib/faraday/adapter/net_http.rb +++ b/lib/faraday/adapter/net_http.rb @@ -9,7 +9,7 @@ end begin - require "socksify/http" + require 'socksify/http' rescue LoadError # socksify is optional end From 0960b41a1dd95b9dafa971654478e82e0b9fbc7b Mon Sep 17 00:00:00 2001 From: rick olson Date: Thu, 13 Jun 2019 11:12:28 -0600 Subject: [PATCH 6/8] more dumb lint rules --- lib/faraday/adapter/net_http.rb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/faraday/adapter/net_http.rb b/lib/faraday/adapter/net_http.rb index 08eb41e70..d844329c9 100644 --- a/lib/faraday/adapter/net_http.rb +++ b/lib/faraday/adapter/net_http.rb @@ -153,7 +153,9 @@ def net_http_connection(env) def proxy_class(proxy) return Net::HTTP if proxy.nil? + return http_proxy(proxy) unless proxy.uri.scheme != 'socks' + socks_proxy(proxy) end @@ -162,17 +164,17 @@ def http_proxy(proxy) proxy[:uri].host, proxy[:uri].port, proxy[:uri].user, - proxy[:uri].password, + proxy[:uri].password ) end def socks_proxy(proxy) - if !Net::HTTP.respond_to?(:SOCKSProxy) - raise "SOCKS proxy support requires the socksify gem ~> 1.7.1" + unless Net::HTTP.respond_to?(:SOCKSProxy) + raise 'SOCKS proxy support requires the socksify gem ~> 1.7.1' end Net::HTTP::SOCKSProxy(proxy[:uri].host, proxy[:uri].port, - proxy[:user], proxy[:password]) + proxy[:user], proxy[:password]) end def configure_ssl(http, ssl) From 7c8e34a4ef0cd09ab8b27a1d2a523506b29bf9d9 Mon Sep 17 00:00:00 2001 From: rick olson Date: Thu, 13 Jun 2019 11:14:24 -0600 Subject: [PATCH 7/8] whatever --- lib/faraday/adapter/net_http.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/faraday/adapter/net_http.rb b/lib/faraday/adapter/net_http.rb index d844329c9..7951bb03b 100644 --- a/lib/faraday/adapter/net_http.rb +++ b/lib/faraday/adapter/net_http.rb @@ -10,8 +10,8 @@ begin require 'socksify/http' -rescue LoadError - # socksify is optional +rescue LoadError # rubocop:disable Lint/HandleExceptions + # socksify is optional. don't @ me end require 'zlib' From 7cf2e05c3cdee2a71b01e3cede99549a910227d4 Mon Sep 17 00:00:00 2001 From: rick olson Date: Thu, 13 Jun 2019 11:23:28 -0600 Subject: [PATCH 8/8] fix if/unless conversion --- lib/faraday/adapter/net_http.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/faraday/adapter/net_http.rb b/lib/faraday/adapter/net_http.rb index 7951bb03b..328db113f 100644 --- a/lib/faraday/adapter/net_http.rb +++ b/lib/faraday/adapter/net_http.rb @@ -154,7 +154,7 @@ def net_http_connection(env) def proxy_class(proxy) return Net::HTTP if proxy.nil? - return http_proxy(proxy) unless proxy.uri.scheme != 'socks' + return http_proxy(proxy) unless proxy.uri.scheme == 'socks' socks_proxy(proxy) end