HTTParty.Перехватить ошибку аутентификации перед анализом ответа с помощью анализатора JSON / XML - PullRequest
1 голос
/ 12 января 2012

С HTTParty я столкнулся с ситуацией, когда я не могу правильно отловить ошибку аутентификации, потому что анализатор JSON или XML перехватывает «HTTP Basic: доступ запрещен». ответ.

Вот мой код:

требуется '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'
    ...

Есть ли какой-нибудь возможный способ отловить эти ошибки аутентификации до того, как парсер получит ответ?

1 Ответ

1 голос
/ 23 октября 2012

Я не говорю, что это наиболее желательное решение, но вы можете достаточно быстро его исправить. Ошибка возникает из класса Parser HTTParty, который вызывает небезопасные методы в 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
...