如何仅为方法设置TCPSocket属性而不是全局?

时间:2017-01-03 16:35:18

标签: ruby-on-rails ruby socks net-http tcpsocket

我使用Rails 4.2.7和Ruby 2.3.0。我有通过SOCKS代理获取网页的代码

require "resolv-replace.rb"
require 'open-uri'
require 'uri'
require "socksify"
require 'socksify/http'
...

  def get_content_via_socks(socks_server, socks_port, url, headers)
    TCPSocket::socks_server = socks_server
    TCPSocket::socks_port = socks_port 
    uri = URI(url)
    res1 = Net::HTTP.SOCKSProxy(nil, nil).start(uri.host, uri.port, :use_ssl => (uri.scheme == "https")) do |http|
      http.read_timeout = 500
      puts "launching #{uri} on #{socks_server}:#{socks_port}"
      resp = http.get(uri, initheader = headers)
    end
  end

这是唯一的问题,即使我已经设置了

    TCPSocket::socks_server = socks_server
    TCPSocket::socks_port = socks_port 

在我的本地方法中,它似乎影响整个应用程序。那是我打电话的时候

http         = Net::HTTP.new(uri.host, uri.port)
从另一个方法

,除非上面的socks_server和socks_port正在运行,否则它会失败。如何仅为该方法设置socks_server和socks_port,而不影响应用程序的其余部分?请不要说这里设置参数

res1 = Net::HTTP.SOCKSProxy(nil, nil)

这些参数毫无意义。您可以将它们设置为" abc"和" def"它们的行为与将它们设置为有效值的行为完全相同。

编辑:包括我的Gemfile

source 'https://rubygems.org'

gem 'rails', '~> 5.0.1'
# Use SCSS for stylesheets
gem 'sass-rails'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier'
# Use CoffeeScript for .coffee assets and views
gem 'coffee-rails'
# See https://github.com/rails/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby

# Use jquery as the JavaScript library
gem 'jquery-rails'
# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
gem 'turbolinks'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
#gem 'jbuilder', '~> 2.5'
# Use Redis adapter to run Action Cable in production
# gem 'redis', '~> 3.0'

gem 'addressable'
gem 'pg'
gem 'pundit'
gem 'omniauth-oauth2', '~> 1.3.1'
gem 'omniauth-google-oauth2'
gem 'omniauth-facebook'
gem 'omniauth-twitter'
gem 'omniauth-linkedin-oauth2'
gem 'jquery-ui-rails'
#gem 'jquery-cookie-rails'
gem 'will_paginate'
gem 'bootstrap-sass'
gem 'autoprefixer-rails'
gem 'compass-rails'
gem 'pdf-reader'
gem 'jquery-turbolinks'
gem 'activerecord-import'
gem 'w3c_validators'
gem 'whenever', :require => false
gem 'roo-xls'
gem 'socksify'

group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platform: :mri
end

group :development do
  # Access an IRB console on exception pages or by using <%= console %> anywhere in the code.
  gem 'web-console'
  gem 'listen', '~> 3.0.5'
  # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
end

group :production do
  gem 'unicorn'
  gem 'puma'
end

1 个答案:

答案 0 :(得分:1)

注释

  

请不要在此处设置参数

     

res1 = Net :: HTTP.SOCKSProxy(nil,nil)

很抱歉,但我不得不说你应该设置这些参数。 :)

在设置TCPSocket::socks_server时,我无法让您的示例正常工作,但在使用Net::HTTP.SOCKSProxy(socks_server, socks_port)时效果很好。

我用过:

$ ruby -v && gem list socksify
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]
*** LOCAL GEMS ***
socksify (1.7.0)

设置

在Linux客户端上,我使用这些命令连接到两台Linux服务器,同时在2个独立的终端中:

ssh -D 1085 linux_server1 -N
ssh -D 1084 linux_server2 -N

我现在在我的客户端上有2个Socks代理,在端口1084和1085上运行。

测试

方法连接到[http://whatismyip.akamai.com] [1]以检查是否正在使用SOCKS代理。

require 'socket'
require 'socksify'
require 'socksify/http'
require 'uri'
require 'net/http'

def translate_ips(str)
  my_ips = {
    "XXX.XXX.XXX.XXX" => 'local_ip  :(',
    "YYY.YYY.YYY.YYY" => 'socks_ip1 :D',
    "ZZZ.ZZZ.ZZZ.ZZZ" => 'socks_ip2 :D'
  }
  str.gsub(/\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3}/,my_ips)
end

def get_content_via_socks_v1(socks_server, socks_port, url, headers)
  TCPSocket::socks_server = socks_server
  TCPSocket::socks_port = socks_port 
  uri = URI(url)
  res1 = Net::HTTP.SOCKSProxy(nil, nil).start(uri.host, uri.port, :use_ssl => (uri.scheme == "https")) do |http|
    http.read_timeout = 500
    puts "launching #{uri} on #{socks_server}:#{socks_port}"
    resp = http.get(uri, initheader = headers)
  end
end

def get_content_via_socks_v2(socks_server, socks_port, url, headers)
  uri = URI(url)
  Net::HTTP.SOCKSProxy(socks_server, socks_port).start(uri.host, uri.port, use_ssl: (uri.scheme == 'https')) do |http|
    http.read_timeout = 500
    puts "launching #{uri} on #{socks_server}:#{socks_port}"
    http.get(uri, headers)
  end
end

puts translate_ips(get_content_via_socks_v1('localhost', 1085, 'http://whatismyip.akamai.com', nil).body)
puts translate_ips(get_content_via_socks_v1('localhost', 1084, 'http://whatismyip.akamai.com', nil).body)
puts
puts translate_ips(get_content_via_socks_v2('localhost', 1085, 'http://whatismyip.akamai.com', nil).body)
puts translate_ips(get_content_via_socks_v2('localhost', 1084, 'http://whatismyip.akamai.com', nil).body)

输出:

launching http://whatismyip.akamai.com on localhost:1085
local_ip  :(
launching http://whatismyip.akamai.com on localhost:1084
local_ip  :(

launching http://whatismyip.akamai.com on localhost:1085
socks_ip1 :D
launching http://whatismyip.akamai.com on localhost:1084
socks_ip2 :D

Net::HTTP.SOCKSProxy(socks_server, socks_port)版本运行正常!

如果我尝试使用Net::HTTP.SOCKSProxy("bogus", "bogus"),该方法会引发异常:

in `rescue in block in connect': Failed to open TCP connection to whatismyip.akamai.com:80 (getaddrinfo: Servname not supported for ai_socktype) (SocketError)

多个线程

在方法开头设置TCPSocket::socks_server不是线程安全的。

使用带有块的Net::HTTP.SOCKSProxy可以防止竞争条件:

threads = []
10.times do
  sleep 0.1
  threads << Thread.new { puts translate_ips(get_content_via_socks_v2('localhost', 1085, 'http://whatismyip.akamai.com', nil).body)}
  threads << Thread.new { puts translate_ips(get_content_via_socks_v2('localhost', 1084, 'http://whatismyip.akamai.com', nil).body)}
end

threads.join

输出:

launching http://whatismyip.akamai.com on localhost:1084
socks_ip2 :D
launching http://whatismyip.akamai.com on localhost:1085
socks_ip1 :D
launching http://whatismyip.akamai.com on localhost:1084
socks_ip2 :D
launching http://whatismyip.akamai.com on localhost:1085
socks_ip1 :D
launching http://whatismyip.akamai.com on localhost:1084
socks_ip2 :D
launching http://whatismyip.akamai.com on localhost:1085
socks_ip1 :D
launching http://whatismyip.akamai.com on localhost:1084
socks_ip2 :D
launching http://whatismyip.akamai.com on localhost:1085
socks_ip1 :D
launching http://whatismyip.akamai.com on localhost:1084
socks_ip2 :D
launching http://whatismyip.akamai.com on localhost:1085
socks_ip1 :D
launching http://whatismyip.akamai.com on localhost:1084
socks_ip2 :D
launching http://whatismyip.akamai.com on localhost:1085
socks_ip1 :D
launching http://whatismyip.akamai.com on localhost:1084
socks_ip2 :D
launching http://whatismyip.akamai.com on localhost:1085
socks_ip1 :D
launching http://whatismyip.akamai.com on localhost:1084
socks_ip2 :D
launching http://whatismyip.akamai.com on localhost:1085
socks_ip1 :D
launching http://whatismyip.akamai.com on localhost:1084
socks_ip2 :D
launching http://whatismyip.akamai.com on localhost:1085
socks_ip1 :D

使用Gemfile进行测试

ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]

和Linux Mint 17上的Gemfile,上面的脚本在使用

启动时工作得很好
rails runner get_content_via_socks.rb

我创建了一个空的Gemset,只添加了你的宝石。结果Gemfile.lock为:

GEM
  remote: https://rubygems.org/
  specs:
    Ascii85 (1.0.2)
    actioncable (5.0.1)
      actionpack (= 5.0.1)
      nio4r (~> 1.2)
      websocket-driver (~> 0.6.1)
    actionmailer (5.0.1)
      actionpack (= 5.0.1)
      actionview (= 5.0.1)
      activejob (= 5.0.1)
      mail (~> 2.5, >= 2.5.4)
      rails-dom-testing (~> 2.0)
    actionpack (5.0.1)
      actionview (= 5.0.1)
      activesupport (= 5.0.1)
      rack (~> 2.0)
      rack-test (~> 0.6.3)
      rails-dom-testing (~> 2.0)
      rails-html-sanitizer (~> 1.0, >= 1.0.2)
    actionview (5.0.1)
      activesupport (= 5.0.1)
      builder (~> 3.1)
      erubis (~> 2.7.0)
      rails-dom-testing (~> 2.0)
      rails-html-sanitizer (~> 1.0, >= 1.0.2)
    activejob (5.0.1)
      activesupport (= 5.0.1)
      globalid (>= 0.3.6)
    activemodel (5.0.1)
      activesupport (= 5.0.1)
    activerecord (5.0.1)
      activemodel (= 5.0.1)
      activesupport (= 5.0.1)
      arel (~> 7.0)
    activerecord-import (0.16.2)
      activerecord (>= 3.2)
    activesupport (5.0.1)
      concurrent-ruby (~> 1.0, >= 1.0.2)
      i18n (~> 0.7)
      minitest (~> 5.1)
      tzinfo (~> 1.1)
    addressable (2.5.0)
      public_suffix (~> 2.0, >= 2.0.2)
    afm (0.2.2)
    arel (7.1.4)
    autoprefixer-rails (6.6.1)
      execjs
    bootstrap-sass (3.3.7)
      autoprefixer-rails (>= 5.2.1)
      sass (>= 3.3.4)
    builder (3.2.3)
    byebug (9.0.6)
    chronic (0.10.2)
    chunky_png (1.3.8)
    coffee-rails (4.2.1)
      coffee-script (>= 2.2.0)
      railties (>= 4.0.0, < 5.2.x)
    coffee-script (2.4.1)
      coffee-script-source
      execjs
    coffee-script-source (1.12.2)
    compass (1.0.3)
      chunky_png (~> 1.2)
      compass-core (~> 1.0.2)
      compass-import-once (~> 1.0.5)
      rb-fsevent (>= 0.9.3)
      rb-inotify (>= 0.9)
      sass (>= 3.3.13, < 3.5)
    compass-core (1.0.3)
      multi_json (~> 1.0)
      sass (>= 3.3.0, < 3.5)
    compass-import-once (1.0.5)
      sass (>= 3.2, < 3.5)
    compass-rails (3.0.2)
      compass (~> 1.0.0)
      sass-rails (< 5.1)
      sprockets (< 4.0)
    concurrent-ruby (1.0.4)
    debug_inspector (0.0.2)
    erubis (2.7.0)
    execjs (2.7.0)
    faraday (0.10.1)
      multipart-post (>= 1.2, < 3)
    ffi (1.9.17)
    globalid (0.3.7)
      activesupport (>= 4.1.0)
    hashery (2.1.2)
    hashie (3.4.6)
    i18n (0.7.0)
    jquery-rails (4.2.2)
      rails-dom-testing (>= 1, < 3)
      railties (>= 4.2.0)
      thor (>= 0.14, < 2.0)
    jquery-turbolinks (2.1.0)
      railties (>= 3.1.0)
      turbolinks
    jquery-ui-rails (6.0.1)
      railties (>= 3.2.16)
    json (2.0.3)
    jwt (1.5.6)
    kgio (2.11.0)
    libv8 (3.16.14.17)
    listen (3.0.8)
      rb-fsevent (~> 0.9, >= 0.9.4)
      rb-inotify (~> 0.9, >= 0.9.7)
    loofah (2.0.3)
      nokogiri (>= 1.5.9)
    mail (2.6.4)
      mime-types (>= 1.16, < 4)
    method_source (0.8.2)
    mime-types (3.1)
      mime-types-data (~> 3.2015)
    mime-types-data (3.2016.0521)
    mini_portile2 (2.1.0)
    minitest (5.10.1)
    multi_json (1.12.1)
    multi_xml (0.6.0)
    multipart-post (2.0.0)
    nio4r (1.2.1)
    nokogiri (1.7.0.1)
      mini_portile2 (~> 2.1.0)
    oauth (0.5.1)
    oauth2 (1.3.0)
      faraday (>= 0.8, < 0.11)
      jwt (~> 1.0)
      multi_json (~> 1.3)
      multi_xml (~> 0.5)
      rack (>= 1.2, < 3)
    omniauth (1.3.1)
      hashie (>= 1.2, < 4)
      rack (>= 1.0, < 3)
    omniauth-facebook (4.0.0)
      omniauth-oauth2 (~> 1.2)
    omniauth-google-oauth2 (0.4.1)
      jwt (~> 1.5.2)
      multi_json (~> 1.3)
      omniauth (>= 1.1.1)
      omniauth-oauth2 (>= 1.3.1)
    omniauth-linkedin-oauth2 (0.1.5)
      omniauth (~> 1.0)
      omniauth-oauth2
    omniauth-oauth (1.1.0)
      oauth
      omniauth (~> 1.0)
    omniauth-oauth2 (1.3.1)
      oauth2 (~> 1.0)
      omniauth (~> 1.2)
    omniauth-twitter (1.3.0)
      omniauth-oauth (~> 1.1)
      rack
    pdf-reader (1.4.1)
      Ascii85 (~> 1.0.0)
      afm (~> 0.2.1)
      hashery (~> 2.0)
      ruby-rc4
      ttfunk
    pg (0.19.0)
    public_suffix (2.0.5)
    puma (3.6.2)
    pundit (1.1.0)
      activesupport (>= 3.0.0)
    rack (2.0.1)
    rack-test (0.6.3)
      rack (>= 1.0)
    rails (5.0.1)
      actioncable (= 5.0.1)
      actionmailer (= 5.0.1)
      actionpack (= 5.0.1)
      actionview (= 5.0.1)
      activejob (= 5.0.1)
      activemodel (= 5.0.1)
      activerecord (= 5.0.1)
      activesupport (= 5.0.1)
      bundler (>= 1.3.0, < 2.0)
      railties (= 5.0.1)
      sprockets-rails (>= 2.0.0)
    rails-dom-testing (2.0.2)
      activesupport (>= 4.2.0, < 6.0)
      nokogiri (~> 1.6)
    rails-html-sanitizer (1.0.3)
      loofah (~> 2.0)
    railties (5.0.1)
      actionpack (= 5.0.1)
      activesupport (= 5.0.1)
      method_source
      rake (>= 0.8.7)
      thor (>= 0.18.1, < 2.0)
    raindrops (0.17.0)
    rake (12.0.0)
    rb-fsevent (0.9.8)
    rb-inotify (0.9.7)
      ffi (>= 0.5.0)
    ref (2.0.0)
    roo (2.7.1)
      nokogiri (~> 1)
      rubyzip (~> 1.1, < 2.0.0)
    roo-xls (1.0.0)
      nokogiri
      roo (>= 2.0.0beta1, < 3)
      spreadsheet (> 0.9.0)
    ruby-ole (1.2.12)
    ruby-rc4 (0.1.5)
    rubyzip (1.2.0)
    sass (3.4.23)
    sass-rails (5.0.6)
      railties (>= 4.0.0, < 6)
      sass (~> 3.1)
      sprockets (>= 2.8, < 4.0)
      sprockets-rails (>= 2.0, < 4.0)
      tilt (>= 1.1, < 3)
    socksify (1.7.0)
    spreadsheet (1.1.4)
      ruby-ole (>= 1.0)
    spring (2.0.0)
      activesupport (>= 4.2)
    spring-watcher-listen (2.0.1)
      listen (>= 2.7, < 4.0)
      spring (>= 1.2, < 3.0)
    sprockets (3.7.1)
      concurrent-ruby (~> 1.0)
      rack (> 1, < 3)
    sprockets-rails (3.2.0)
      actionpack (>= 4.0)
      activesupport (>= 4.0)
      sprockets (>= 3.0.0)
    therubyracer (0.12.3)
      libv8 (~> 3.16.14.15)
      ref
    thor (0.19.4)
    thread_safe (0.3.5)
    tilt (2.0.5)
    ttfunk (1.4.0)
    turbolinks (5.0.1)
      turbolinks-source (~> 5)
    turbolinks-source (5.0.0)
    tzinfo (1.2.2)
      thread_safe (~> 0.1)
    uglifier (3.0.4)
      execjs (>= 0.3.0, < 3)
    unicorn (5.2.0)
      kgio (~> 2.6)
      raindrops (~> 0.7)
    w3c_validators (1.3.1)
      json (~> 2.0)
      nokogiri (~> 1.6)
    web-console (3.4.0)
      actionview (>= 5.0)
      activemodel (>= 5.0)
      debug_inspector
      railties (>= 5.0)
    websocket-driver (0.6.4)
      websocket-extensions (>= 0.1.0)
    websocket-extensions (0.1.2)
    whenever (0.9.7)
      chronic (>= 0.6.3)
    will_paginate (3.1.5)

PLATFORMS
  ruby

DEPENDENCIES
  activerecord-import
  addressable
  autoprefixer-rails
  bootstrap-sass
  byebug
  coffee-rails
  compass-rails
  jquery-rails
  jquery-turbolinks
  jquery-ui-rails
  listen (~> 3.0.5)
  omniauth-facebook
  omniauth-google-oauth2
  omniauth-linkedin-oauth2
  omniauth-oauth2 (~> 1.3.1)
  omniauth-twitter
  pdf-reader
  pg
  puma
  pundit
  rails (~> 5.0.1)
  roo-xls
  sass-rails
  socksify
  spring
  spring-watcher-listen (~> 2.0.0)
  therubyracer
  turbolinks
  uglifier
  unicorn
  w3c_validators
  web-console
  whenever
  will_paginate

BUNDLED WITH
   1.13.7





  [1]: http://whatismyip.akamai.com