From: Erik Wessel Date: 2005-11-12T02:27:14+09:00 Subject: Proxy Authentication in open-uri This is the first time I've posted, so bear with me if I defy any conventions. A problem I've run into a couple times while writing programs for myself at work (and using Ruby Gems, as well) has been that our company uses an authenticating proxy. There's apparently no way to cleanly write something that authenticates to a proxy with open-uri. I found a post on this group by Tanaka Akira saying that open-uri doesn't have that functionality because he's not sure how to encode the user/pass correctly. There's a quick work-around that I've discovered, having this problem with a lot of programming I've done here at work. The encoding is a simple base64 encoding, with the right syntax in a header on the request: Authorization: Basic This is for basic HTTP proxies. I have no idea how it works on other proxies, like SOCKS. So, to get open-uri to work you could do something ugly like: ***** require 'open-uri' require 'base64' open("http://some.web-site.tld", :proxy => "http://my.http-proxy.tld", "Authorization" => "Basic " << Base64.encode64("user:pass")) do |page| puts page.read end ***** However I've hacked at open-uri.rb a little (and I mean *hacked*, with an axe), and come up with this: diff 1.8/open-uri.rb site_ruby/1.8/open-uri.rb 97a98,99 > :proxy_user => true, > :proxy_pass => true 101a104 > new_options = {} 106a110,121 > if ((k == :proxy_user) && !options.keys().include?("Authorization")) then > unless options.keys().member?(:proxy_pass) then > raise ArgumentError, ":proxy_pass needs to be defined" > end > new_options = OpenURI.basic_auth(options[:proxy_user],options[:proxy_pass]) > end > if ((k == :proxy_pass) && !options.keys().include?("Authorization")) then > unless options.keys().member?(:proxy_user) then > raise ArgumentError, ":proxy_user needs to be defined" > end > new_options = OpenURI.basic_auth(options[:proxy_user],options[:proxy_pass]) > end 107a123,128 > options.update(new_options) > end > > def OpenURI.basic_auth(username,password) > require 'base64' > {"Authorization" => "Basic " << Base64.encode64("#{username}:#{password}")} Applying these changes to the open-uri.rb file, you can now do this: ***** require 'open-uri' open("http://some.web-site.tld", :proxy => "http://my.http-proxy.tld", :proxy_user => "user", :proxy_pass => "pass") do |page| puts page.read end ***** I hope this helps those of you out there who need to get through an authenticating proxy. --Erik