如何让HTTP 100在嵌入式Grizzly上继续为WebDAV工作?

如何让HTTP 100在嵌入式Grizzly上继续为WebDAV工作?,http,servlets,webdav,grizzly,milton,Http,Servlets,Webdav,Grizzly,Milton,我正在使用Milton WebDAV服务器(1.6.8)和嵌入式Grizzly servlet容器(2.1.7),在它们的默认配置中,PUT请求(至少由Cyberduck发出)不起作用。我已经追踪到了HTTP 100 Continue如何处理的问题(它显然也会影响Jetty),一条关于的消息说这是servlet容器的错误,它试图巧妙地使用“透明的expect/Continue处理” 是的,透明处理的容器将继续有效地破坏Webdav的HTTP安全性。HTTP使用质询/响应安全模型,许多客户端依赖于

我正在使用Milton WebDAV服务器(1.6.8)和嵌入式Grizzly servlet容器(2.1.7),在它们的默认配置中,PUT请求(至少由Cyberduck发出)不起作用。我已经追踪到了HTTP 100 Continue如何处理的问题(它显然也会影响Jetty),一条关于的消息说这是servlet容器的错误,它试图巧妙地使用“透明的expect/Continue处理”

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

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

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

但是,总的来说,我认为你应该试着找出Grizzly的透明处理是否可以被禁用,然后在milton中重新启用支持

如何禁用Grizzly的透明expect/continue处理,这真的是正确的方法吗?另一种选择是在Milton中关闭expect/continue处理,但这似乎破坏了WebDAV身份验证


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

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

我还没有对此进行过太多的详细研究,所以我无法确定哪些容器进行透明处理,是否可以禁用,或者客户端应用程序需要它


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

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

我还没有对此进行过太多的详细研究,所以我无法确定哪些容器进行透明处理,是否可以禁用,或者客户端应用程序需要它


如果Grizzly或Tomcat的人可以对禁用容器处理的选项发表评论,这可能会很好。

关于Grizly 2.x,您需要在
ServletHandler
中重写
sendAcknowledgement
方法,如下所示:

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;
        }
    }
}

希望它能有所帮助。

关于Grizly 2.x,您需要在
ServletHandler
中重写
sendAcknowledgement
方法,如下所示:

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;
        }
    }
}

希望能有所帮助。

尝试过,但没有成功。也放了一个断点,但没有放进去。谁应该呼叫
sendAcknowledge
以及何时?从我看到的情况来看,Milton只是将状态代码设置为SC_CONTINUE并完成请求处理。明天将深入挖掘,但目前看来,
sendAcknowledge
不是在我的ServletHandler上调用的,而是在HttpHandlerChain.pls上调用的。尝试最新的Grizzly 2.1.8,现在它确实会被调用。我发誓昨天没有2.1.8;-)。但是什么是
authClient
?我们刚刚发布了2.1.8:)authClient()什么都不是,只是您可以在那里实现的“任何”逻辑的一个示例。尝试过,但没有成功。也放了一个断点,但没有放进去。谁应该呼叫
sendAcknowledge
以及何时?从我看到的情况来看,Milton只是将状态代码设置为SC_CONTINUE并完成请求处理。明天将深入挖掘,但目前看来,
sendAcknowledge
不是在我的ServletHandler上调用的,而是在HttpHandlerChain.pls上调用的。尝试最新的Grizzly 2.1.8,现在它确实会被调用。我发誓昨天没有2.1.8;-)。但是什么是
authClient
?我们刚刚发布了2.1.8:)authClient()什么都不是,只是一个可以在那里实现的“任何”逻辑的示例。对于Milton来说,有一个“引用容器”可以让expect continue开箱即用吗?如果我不能使它工作,我就不必使用Grizzly。对于Milton来说,有没有一个“参考容器”可以让expect continue开箱即用?我不必使用灰熊,如果我不能使它工作。