Is there a way to attach Ruby Net::HTTP request to a specific IP address / network interface?

荒凉一梦 提交于 2019-12-05 00:07:39

Doesn't look like you can do it with Net:HTTP. Here's the source

http://github.com/ruby/ruby/blob/trunk/lib/net/http.rb

Line 644 is where the connection is opened

  s = timeout(@open_timeout) { TCPSocket.open(conn_address(), conn_port()) }

The third and fourth arguments to TCPSocket.open are local_address and local_port, and since they're not specified, it's not possible. Looks like you'll have to go with curb.

I know this is old, but hopefully someone else finds this useful, as I needed this today. You can do the following:

http = Net::HTTP.new(uri.host, uri.port)
http.local_host = ip
response = http.request(request)

Note that you I don't believe you can use Net::HTTP.start, as it doesn't accept local_host as an option.

There is in fact a way to do this if you monkey patch TCPSocket:

https://gist.github.com/800214

Curb is awesome but won't work with Jruby so I've been looking into alternatives...

kadashu

Of course you can. I did as below:

# remote_host can be IP or hostname
uri     = URI.parse( "http://" + remote_host )
http    = Net::HTTP.new( uri.host, uri.port )
request = Net::HTTP::Get.new(uri.request_uri)
request.initialize_http_header( { "Host" => domain })
response = http.request( request )
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!