2015-11-04 59 views
2

我對Spray很新,所以我猜這只是我沒有正確理解框架的工作原理。然而,當我試圖處理時,我遇到了似乎很奇怪的行爲。此問題具體參考this documentation on directives,但它也可能適用於其他自定義指令。噴灑授權指令不能按預期工作?

當我嘗試使用Spray附帶的authorize指令時,HTTP響應根據返回的值正確顯示。也就是說,當authorize的返回值是false時,我得到了一個403 Forbidden,而當它是true時,我得到200 OK。但是,似乎傳遞給它的函數仍然執行,即使它看起來不應該。

請看我創建的this SBT project來測試這個。它完全證明了我的問題,所以,希望這有助於解決我的問題。與運行:

sbt test 

你應該在默認情況下看到的輸出應該是非常類似以下內容:

[info] Test: 
[info] route 
[info] - should succeed and have side effects 
[info] - should fail and not have side effects *** FAILED *** 
[info] 1 did not equal 0 (Test.scala:28) 
[info] Run completed in 779 milliseconds. 
[info] Total number of tests run: 2 
[info] Suites: completed 1, aborted 0 
[info] Tests: succeeded 1, failed 1, canceled 0, ignored 0, pending 0 
[info] *** 1 TEST FAILED *** 

再次,我所關注的是:爲什麼是傳遞到Directive0的函數體authorized甚至在請求被拒絕時執行?

(道歉,如果這是一個重複,我沒能在其他地方在這裏找到一個類似的問題,但溫和關閉這個問題,如果你能找到一個)

+0

此外,對於它的價值,我開了一個同樣的問題在他們的GitHub問題頁面:https://github.com/spray/spray/issues/1084 – rkoval

回答

1

路由API的語義在http://spray.io/documentation/1.2.3/spray-routing/advanced-topics/understanding-dsl-structure/解釋。關鍵的一點是與此有關:

把定製邏輯航線結構內部的錯誤,但 外葉級路線,並期待它在 請求處理時間執行,是可能是最新的 噴霧用戶看到的最常見的錯誤。

在參考頁面中顯示了兩個對比例。在這個例子中,println的發生一次(在路線創建時間):

val route: Route = get { 
    println("MARK") 
    complete("yeah") 
} 

而在這個例子中,println的情況與每一個請求:

val route: Route = get { 
    complete { 
    println("MARK") 
    "yeah" 
    } 
} 
+0

真棒,這完美地解釋了我的問題。看起來我應該仔細閱讀更多高級主題,以避免更多這些問題。 – rkoval

+0

這看起來像噴霧的工作方式的一個相當重大的缺陷。看起來,完整塊和onComplete塊會觸發拒絕被讀取(實際上,它是釋放處理拒絕消息的參與者)。 想象一下產生未來的副作用,你需要使用onComplete噴霧方法。未來將繼續處理副作用,直到onComplete方法在看到拒絕時取消它。 – JBarber

+0

爲了擴展更多,給定[這個例子](https://gist.github.com/Jacoby6000/250faa7068933ad3eca1),它會一直創建對象,即使在拒絕的情況下。 – JBarber