如何获取HTTP 100继续在嵌入式Grizzly上使用WebDAV?

时间:2011-12-05 02:15:40

标签: http servlets webdav grizzly milton

我正在使用带有嵌入式Grizzly servlet容器(2.1.7)的Milton WebDAV服务器(1.6.8),并且在默认配置中,PUT请求(至少由Cyber​​duck发布)不起作用。我已经将问题跟踪到了如何处理HTTP 100 Continue(它显然也影响Jetty)的问题,Milton mailing listbug tracker上的消息说它是servlet容器的错误,尝试用“透明的期望/继续处理”来聪明。

  

是的,透明处理的容器会继续有效地破坏Webdav的HTTP安全性。 HTTP使用挑战/响应安全模型,许多客户端依赖于此。即,如果执行PUT,他们将只执行未经身份验证的PUT并依赖ExpectContinue来确保在上载文件之前发出质询。

     

但是通过透明处理ExpectContinue,整个文件在milton API能够检查当前用户是否经过身份验证并被授权执行操作之前上传。

     

根据您支持的客户和您使用案例,这可能是完全不可接受的,令人讨厌或根本不是问题。

     

但是,一般来说,我认为你应该试着找出是否可以禁用Grizzly的透明处理,然后重新启用米尔顿的支持。

我可以做些什么来禁用Grizzly的透明期望/继续处理,这是非常正确的方法吗?另一种方法是关闭Milton中的期望/继续处理,但这似乎打破了WebDAV身份验证。

更新:我现在也尝试过Jetty(8.1.0.RC1),它表现出与Grizzly相同的行为:只有关闭了expect / continue处理,我可以使用默认PUT文件设置它不起作用。

2 个答案:

答案 0 :(得分: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;
        }
    }
}

希望它会有所帮助。

答案 1 :(得分:0)

请注意,透明的期望 - 继续处理是否存在问题取决于您的目标客户端应用程序是否使用expect-continue身份验证。

我还没有详细研究过这个问题,所以我不能肯定地说哪些容器可以进行透明处理,是否可以禁用,或者客户端应用程序需要它。

如果来自Grizzly或Tomcat的人可以评论禁用容器处理的选项,那么可能会很好。