Ruby “为什么机械化提高?”;未定义的方法';任何?'&引用;当它看到坏的OAuth凭据时?

Ruby “为什么机械化提高?”;未定义的方法';任何?'&引用;当它看到坏的OAuth凭据时?,ruby,oauth,oauth-2.0,mechanize,mechanize-ruby,Ruby,Oauth,Oauth 2.0,Mechanize,Mechanize Ruby,我正在测试一些在幕后使用Mechanize的Ruby代码。我发现当我在请求中传递错误的OAuth令牌时,Mechanize会抛出一个意外的异常 我使用坏令牌进行呼叫,该呼叫引发以下异常: #<NoMethodError: undefined method `any?' for nil:NilClass> #初始响应包含一个带有错误信息的WWW-AUTHENTICATE标头: response-header: www-authenticate => Bearer realm=a

我正在测试一些在幕后使用Mechanize的Ruby代码。我发现当我在请求中传递错误的OAuth令牌时,Mechanize会抛出一个意外的异常

我使用坏令牌进行呼叫,该呼叫引发以下异常:

#<NoMethodError: undefined method `any?' for nil:NilClass>

#初始响应包含一个带有错误信息的WWW-AUTHENTICATE标头:

response-header: www-authenticate => Bearer realm=api.att.com,error=invalid_token, error_description=the token is not valid
从我的阅读来看,这是正确的用法。然而,通过跟踪Mechanize代码,我看到Mechanize假设WWW-AUTHENTICATE头将包含一个或多个挑战,描述如何使用身份验证重试请求。我在#response#u authenticate中的agent.rb:702处找到了自己,在那里它通过以下方式检查凭据:

@auth_store.credentials?
而该方法反过来调用#any?在nil对象上,由于它无法解析标头之外的任何质询:

def credentials? uri, challenges
    challenges.any? do |challenge|
        credentials_for uri, challenge.realm_name
    end
end

如果你看一看,你会发现Mechanize::HTTP::WWWAAuthenticateParser#parse在某些条件下可以返回nil(截至本文第83行),我不确定为什么这可能有用,但这是你的答案。

你的问题是
nil.any?
为什么会引发这个错误?我的问题是-Mechanize为什么会出现意外行为(提出一个不相关的例外)当我发送一个带有错误oauth令牌的请求时?Mechanize提供了它所需的所有信息来告诉我令牌是错误的,但它会引发这个未定义的方法异常。我做了一些分析,我的最佳猜测如下面的第一个答案所示;但我真的希望看到真正熟悉代码的人来验证或更正。谁在乎呢?我如果它引发了一个无挑战性的异常,可能会更好,但是你用同样的方法处理它,捕获错误并处理它。因为我在Mechanize上测试一个库,当我遇到这个异常时,我不知道库是否有bug,或者Mechanize是否有问题。我必须调试到Mechanize中,以了解发生了什么。此外,这个异常on不允许我的测试代码访问带有WWW Authenticate标头中详细错误信息的实际响应。我承认这更多的是一个错误报告,而不是一个问题-这就是为什么我自己回答了它-但是由于mechanize用户邮件列表的主持人不接受我发布的这个问题,这是我知道的下一个最好的解决方法社区不知道这个问题。