2011-12-05 16 views
1

我正在使用Milton WebDAV服務器(1.6.8)和一個嵌入式Grizzly servlet容器(2.1.7),並且在其默認配置中,PUT請求(至少與Cyber​​duck頒發的一樣)不起作用。我已經跟蹤了HTTP 100 Continue如何處理的問題(它顯然也影響了Jetty),Milton mailing listbug tracker上的消息說這是servlet容器的錯誤,該容器嘗試使用「透明期望/繼續處理「。如何獲取HTTP 100繼續在嵌入式Grizzly上使用WebDAV?

是的,容器透明地處理期望繼續有效地打破Webdav的HTTP安全。 HTTP使用挑戰/響應安全模型,許多客戶依賴它。也就是說,如果執行PUT,他們只會執行未經身份驗證的PUT,並依靠ExpectContinue確保在文件上傳前發佈挑戰。

但透明處理ExpectContinue在milton API能夠檢查當前用戶是否通過身份驗證和授權執行操作之前,整個文件會被上傳。

根據您支持的客戶和您的使用情況,這可能是完全不可接受的,這是一個麻煩或根本不是問題。

但是,一般來說,我認爲您應該嘗試查明Grizzly的透明處理是否可以禁用,然後在milton中重新啓用支持。

我該怎麼做才能禁用灰熊的透明預期/繼續處理,這是真正正確的方法嗎?另一種方法是關閉Milton的預期/繼續處理,但這似乎打破了WebDAV身份驗證。

更新:我也試過現在碼頭(8.1.0.RC1),它表現出相同的行爲,灰熊:只希望/繼續處理關閉我可以把文件,它不會默認設置工作。

回答

0

請注意,透明expect-continue處理是否是一個問題取決於您的目標客戶端應用程序是否使用expect-continue認證。

我還沒有研究太多的細節,所以我不能肯定地說哪些容器可以進行透明處理,以及它是否可以被禁用,或者客戶端應用程序需要它。

如果來自Grizzly或Tomcat的人可以對禁用容器處理的選項發表評論,可能會很好。

+0

米爾頓有一個「參考容器」,期望 - 繼續開箱即用嗎?如果我不能使它工作,我不必使用灰熊。 – Thilo

1

關於Grizly 2.x中,你需要重寫sendAcknowledgment方法在ServletHandler如下所示:

class MyServletHandler extends ServletHandler 
{ 
    protected boolean sendAcknowledgment(final Request request, 
     final Response response) 
     throws IOException 
    { 
     if (authClient(request, response) 
     { 
      return super.sendAcknowledgment(request, response); 
     } 
     else 
     { 
      response.setStatus(HttpStatus.EXPECTATION_FAILED_417); 
      return false; 
     } 
    } 
} 

希望這將有助於。

+0

試過了,但沒有奏效。也放了一個斷點,但它沒有去那裏。誰應該稱之爲「sendAcknowledgement」以及何時?從我所看到的,Milton只是將狀態碼設置爲SC_CONTINUE並完成請求處理。 – Thilo

+0

明天會深入挖掘,但現在看起來'sendAcknowledgement'被調用的不是在我的ServletHandler上,而是在HttpHandlerChain上。 – Thilo

+0

。嘗試最新的灰熊2.1.8 – alexey

相關問題