2012/01/06

gem twitterで認証付きproxyを越える方法 (続き)

昨日の続き。

rubygemsのfaradayの動作をスッキリさせる方法。

require 'rubygems'
require 'twitter'
require 'pp'

module Faraday
  class Adapter
    class NetHttp 
      def net_http_class(env)
        if proxy = env[:request][:proxy] 
          Net::HTTP::Proxy(proxy[:uri].host, proxy[:uri].port, proxy[:uri].user, proxy[:uri].password)
        else
          Net::HTTP
        end 
      end 
    end 
  end 
end

Twitter.configure do |config|
  config.proxy = { 
    :uri => "http://ユーザ名:パスワード@localhost:3128/"
  }
end

pp Twitter.user_timeline("wakatter")

これが一番すっきりする気がした。

gem twitterで認証付きproxyを越える方法

rubygemsのtwitterライブラリ"twitter"を使って認証付きproxyを越える方法を考えてみました。
ライブラリ自体の使い方は調べ中なので他のサイトを漁ってみてください。

方法1. Twitter.configureでproxy(別々にuri,user,password)を設定する。
require 'rubygems'
require 'twitter'

Twitter.configure do |config|
   config.proxy = {
       :uri => "http://hostname",
       :user => "proxy_user_name",
       :password => "proxy_password"
    }
end

p Twitter.user_timeline("wakatter")

方法2. Twitter.configureでproxy(uri文字列)を設定する。

設定値として"http://ユーザID:パスワード@ホスト名:ポート番号/"なURIとして有効な文字列を指定してあげたいという方法。

require 'rubygems'
require 'twitter'
require 'pp'

module Faraday
  class Connection
    def proxy(arg = nil)
      return @proxy if arg.nil?

      @proxy = 
        case arg 
        when String then {:uri => proxy_arg_to_uri(arg)}
        when URI    then {:uri => arg}
        when Hash
          if arg[:uri] = proxy_arg_to_uri(arg[:uri])
            arg 
          else
            raise ArgumentError, "no :uri option."
          end 
        end 
      if (@proxy[:uri].user and @proxy[:uri].password) then
        @proxy[:user] = @proxy[:uri].user
        @proxy[:password] = @proxy[:uri].password
      end 
      @proxy
    end 
  end 
end

Twitter.configure do |config|
  config.proxy = { 
    :uri => "http://ユーザ名:パスワード@localhost:3128/"
  }
end

pp Twitter.user_timeline("wakatter")

ここまでやってみて、fadarayというgemライブラリのプロキシ設定のデータ構造がopen-uriで使える環境変数での値と異なるところが気持ち悪い事がはっきりした。