1

HTTPartyを使用すると、JSONまたはXMLパーサーが「HTTPBasic:Accessdenied」をインターセプトするために認証エラーを正しくキャッチできない状況に遭遇しました。応答。

これが私のコードです:

「rubygems」が必要「httparty」が必要

class Client
  include HTTParty
  def initialize(host, user, password)
    self.class.base_uri host
    self.class.basic_auth user, password
  end

  def get(base_path, data_format)
    self.class.get("#{base_path}.#{data_format}")
  end
end

cl = Client.new('host.com', 'useranme', 'password')
p cl.get('/resource_path', 'json')

これを実行すると、ユーザー名またはパスワードが間違っていると、次のエラーが発生します。

/home/ayurchuk/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/json/common.rb:148:in `parse': 743: unexpected token at 'HTTP Basic: Access denied. (MultiJson::DecodeError)
'
    from /home/ayurchuk/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/json/common.rb:148:in `parse'
    from /home/ayurchuk/.rvm/gems/ruby-1.9.3-p0@uitests/gems/multi_json-1.0.4/lib/multi_json/engines/json_common.rb:9:in `decode'
    from /home/ayurchuk/.rvm/gems/ruby-1.9.3-p0@uitests/gems/multi_json-1.0.4/lib/multi_json.rb:76:in `decode'
    from /home/ayurchuk/.rvm/gems/ruby-1.9.3-p0@uitests/gems/httparty-0.8.1/lib/httparty/parser.rb:116:in `json'
    from /home/ayurchuk/.rvm/gems/ruby-1.9.3-p0@uitests/gems/httparty-0.8.1/lib/httparty/parser.rb:136:in `parse_supported_format'
    ...

パーサーが応答を取得する前に、これらの認証エラーをキャッチする方法はありますか?

4

1 に答える 1

1

これが最も望ましい解決策だと言っているわけではありませんが、モンキー パッチをすぐに適用できます。このエラーは、HTTParty の Parser クラスから発生します。このクラスは、可能性のあるエラーを処理せずに、MultiJson で安全でないメソッドを呼び出します。

以下をイニシャライザにドロップしたところ、これらの応答を調べて 401 ステータス コードを探すことができます。これだけで十分です。

module HTTParty
  class Parser
    protected
    def json
      if MultiJson.respond_to?(:adapter)
        MultiJson.load(body) rescue {}
      else
        MultiJson.decode(body) rescue {}
      end
    end
  end
end
于 2012-10-23T02:55:56.010 に答える