在jruby代理问题localhost上打开uri

时间:2013-08-15 10:40:31

标签: jruby open-uri

我最初使用rsolr生成并连接到本地计算机上的solr核心。这一切在红宝石中都很好用,直到我们变成了犹豫不决。我现在收到localhost http请求的504网关错误。这来自Open-uri。我们有一个代理,我没有设置它,设置它并使用Net::HTTP::Proxy尝试连接到localhost。

我得到的错误是:

require 'open-uri'
open("http://127.0.0.1:8984/solr/")

OpenURI::HTTPError: 504 Gateway Time-out
  from /Users/adamcryer/.rvm/rubies/jruby-1.7.4/lib/ruby/1.9/open-uri.rb:346:in `open_http'
  from /Users/adamcryer/.rvm/rubies/jruby-1.7.4/lib/ruby/1.9/open-uri.rb:775:in `buffer_open'
  from /Users/adamcryer/.rvm/rubies/jruby-1.7.4/lib/ruby/1.9/open-uri.rb:203:in `open_loop'
  from org/jruby/RubyKernel.java:1254:in `catch'
  from /Users/adamcryer/.rvm/rubies/jruby-1.7.4/lib/ruby/1.9/open-uri.rb:201:in `open_loop'
  from /Users/adamcryer/.rvm/rubies/jruby-1.7.4/lib/ruby/1.9/open-uri.rb:146:in `open_uri'
  from /Users/adamcryer/.rvm/rubies/jruby-1.7.4/lib/ruby/1.9/open-uri.rb:677:in `open'
  from /Users/adamcryer/.rvm/rubies/jruby-1.7.4/lib/ruby/1.9/open-uri.rb:33:in `open'
  from (irb):3:in `evaluate'
  from org/jruby/RubyKernel.java:1093:in `eval'
  from org/jruby/RubyKernel.java:1489:in `loop'
  from org/jruby/RubyKernel.java:1254:in `catch'
  from org/jruby/RubyKernel.java:1254:in `catch'
  from /Users/adamcryer/.rvm/rubies/jruby-1.7.4/bin/irb:13:in `(root)'

我也尝试了localhost的别名 - > 127.0.0.1,0.0.0.0和我的实际本地IP 192 ..

知道为什么会这样。可以在jruby中打开URI而不处理重定向吗?

编辑:如果使用真正的本地IP,即192 ....(但不在localhost,127.0.0.1上),它会连接:

jruby-1.7.4 :013 > open("http://127.0.0.1:8985/solr/")
  OpenURI::HTTPError: 504 Gateway Time-out
    from /Users/adamcryer/.rvm/rubies/jruby-1.7.4/lib/ruby/1.9/open-uri.rb:346:in `open_http'
    from /Users/adamcryer/.rvm/rubies/jruby-1.7.4/lib/ruby/1.9/open-uri.rb:775:in `buffer_open'
    from /Users/adamcryer/.rvm/rubies/jruby-1.7.4/lib/ruby/1.9/open-uri.rb:203:in `open_loop'
    from org/jruby/RubyKernel.java:1254:in `catch'
    from /Users/adamcryer/.rvm/rubies/jruby-1.7.4/lib/ruby/1.9/open-uri.rb:201:in `open_loop'
    from /Users/adamcryer/.rvm/rubies/jruby-1.7.4/lib/ruby/1.9/open-uri.rb:146:in `open_uri'
    from /Users/adamcryer/.rvm/rubies/jruby-1.7.4/lib/ruby/1.9/open-uri.rb:677:in `open'
    from /Users/adamcryer/.rvm/rubies/jruby-1.7.4/lib/ruby/1.9/open-uri.rb:33:in `open'
    from (irb):13:in `evaluate'
    from org/jruby/RubyKernel.java:1093:in `eval'
    from org/jruby/RubyKernel.java:1489:in `loop'
    from org/jruby/RubyKernel.java:1254:in `catch'
    from org/jruby/RubyKernel.java:1254:in `catch'
    from /Users/adamcryer/.rvm/rubies/jruby-1.7.4/bin/irb:13:in `(root)'
jruby-1.7.4 :014 > open("http://192.168.2.210:8985/solr/")
 => #<StringIO:0x385715 @status=["200", "OK"], @meta={"content-    type"=>"text/html;charset=UTF-8", "x-cache"=>"MISS from pH-squid", "x-cache-lookup"=>"MISS from pH-squid:3128", "via"=>"1.1 pH-squid:3128 (squid/2.7.STABLE9)", "connection"=>"close"}, @base_uri=#<URI::HTTP:0x2a717ef5 URL:http://192.x.x.x:8985/solr/>>

感谢您提前提供任何帮助

修改

这基本上与以下内容重复:

Make JRuby inherit Java proxy settings

1 个答案:

答案 0 :(得分:0)

请参阅Make JRuby inherit Java proxy settings

其中基本上表明:

我遇到了同样的问题。我发现java或net :: http不服从nonProxyHosts选项。解决此问题的最佳方法是修改ENV_JAVA设置以解决此问题。

我使用以确保使用nonProxyHosts的步骤如下:

1) JAVA_OPTS="-Dhttp.proxyHost=192*** -Dhttp.proxyPort=1234 -Dhttp.nonProxyHosts=local|127.0.0.1"
OR
1) JRUBY_OPTS="-J-Dhttp.proxyHost=192*** -J-Dhttp.proxyPort=1234 -J-Dhttp.nonProxyHosts=local|127.0.0.1"

请记住,至少对于java1.7,nonProxyHosts不应该有引用,请参阅此处。

现在我发现net :: http或java本身实际上并不尊重nonProxyHosts选项。

但是,您可以通过在JRuby

中执行以下操作来解决此问题
a = URI("http://someurl")
Net::HTTP.new(a).proxy?.should == true
regex = /$#{ENV_JAVA["http.nonProxyHosts"]}/ #dollar needed to behave as expected
if a.hostname.match(regex)
  ENV_JAVA["http.proxyHost"]=nil
end
Net::HTTP.new(a).proxy?.should == false

或者至少这是我能让它工作的唯一方法