2012-10-04 12 views
0

我正在測試一些使用機械化下的Ruby代碼。我發現,當我在請求中傳遞錯誤的OAuth令牌時,Mechanize會引發意外的異常。爲什麼Mechanize在發現錯誤的OAuth憑證時提升「未定義的方法」?

我做我的壞令牌呼叫,呼叫引發以下異常:

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

我有一些額外的分析,我會後作爲一個答案,但如果任何人有額外的洞察力它將不勝感激。

我試着把這個問題放在mechanize-users郵件列表上,但版主沒有發佈它。

+0

是你的問題爲什麼'nil.any?'提出這個錯誤? – pguardiario

+0

我的問題是 - 爲什麼機械發生意外行爲(引發一個無關的異常),當我發送帶有錯誤oauth標記的請求時? Mechanize擁有它需要的所有信息來告訴我令牌是不好的,但它引發了這個未定義的方法異常。我做了一些分析,我的最佳猜測是下面的第一個答案。但我真的很希望看到有人真正熟悉代碼來驗證或糾正。 – Bruce

+0

誰在乎?如果它引發一個NoChallengesException異常可能會更好,但是你以相同的方式處理它,捕獲錯誤並處理它。 – pguardiario

回答

0

初始響應包含WWW身份驗證標頭的錯誤信息:

response-header: www-authenticate => Bearer realm=api.att.com,error=invalid_token, error_description=the token is not valid 

從我的the OAuth spec閱讀這是正確的用法。但是,通過跟蹤Mechanize代碼,我發現Mechanize假定WWW-AUTHENTICATE頭將包含一個或多個挑戰,描述如何重新驗證請求。我在agent.rb具體發現自己:在#response_authenticate 702,在​​那裏檢查與證書:

@auth_store.credentials? 

而反過來這種方法調用#任何? nil對象上,因爲它沒能解析任何挑戰了頭的:

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

如果你看看here您可以用比機械化看到:: HTTP :: WWWAuthenticateParser#解析可以返回在一定條件下無(第83行作爲這篇文章)我不知道爲什麼這可能是有用的,但有你的答案。

相關問題