Как получить HTTP 100 Продолжить работать для WebDAV на встроенном Grizzly? - PullRequest
1 голос
/ 05 декабря 2011

Я использую сервер Milton WebDAV (1.6.8) со встроенным контейнером сервлета Grizzly (2.1.7), и в их конфигурации по умолчанию запросы PUT (по крайней мере, выданные Cyberduck) не работают.Я проследил проблему до проблемы с тем, как обрабатывается HTTP 100 Continue (это, по-видимому, также влияет на Jetty), в сообщениях Milton и bug tracker говорится, что этоошибка контейнера сервлета, который пытается быть умным с «прозрачной обработкой ожидания / продолжения».

Да, контейнеры, которые прозрачно обрабатывают ожидание, продолжают эффективно нарушать безопасность HTTP для Webdav.HTTP использует модель безопасности «вызов / ответ», и многие клиенты полагаются на это.Т.е. при выполнении PUT они просто будут выполнять PUT без аутентификации и будут полагаться на ExpectContinue, чтобы убедиться, что вызов выдается до загрузки файла.

Но при прозрачной обработке ExpectContinue весь файл загружается до того, какMilton API может проверить, аутентифицирован ли текущий пользователь и авторизован ли он для выполнения действия.

В зависимости от поддерживаемых клиентов и случаев использования, это может быть либо совершенно неприемлемым, либо неудобством, либо совсем не проблемой.

Но, как правило, я думаю, вам следует попытаться выяснить, можно ли отключить прозрачную обработку в Grizzly, а затем снова включить поддержку в милтонах.

Что можно сделать, чтобы отключитьПрозрачная обработка ожиданий / продолжений Гризли, и действительно ли это правильный подход?В качестве альтернативы можно было бы отключить ожидание / продолжение обработки в Милтоне, но, похоже, это нарушает аутентификацию WebDAV.

Обновление: Я также пробовал Jetty сейчас (8.1.0.RC1), ион демонстрирует то же поведение, что и Grizzly: только при отключенной функции «ожидать / продолжить» я могу ЗАДЕРЖАТЬ файлы, с настройками по умолчанию он не работает.

Ответы [ 2 ]

1 голос
/ 13 декабря 2011

Что касается 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 голосов
/ 08 декабря 2011

Обратите внимание, что проблема в прозрачной обработке ожидаемого продолжения зависит от того, использует ли целевые клиентские приложения аутентификацию ожидаемого продолжения или нет.

Я еще не исследовал это слишком подробно,поэтому я не могу с уверенностью сказать, какие контейнеры выполняют прозрачную обработку и можно ли ее отключить, или какие клиентские приложения этого требуют.

Может быть хорошо, если кто-то из Grizzly или Tomcat сможет прокомментировать варианты отключенияобработка контейнеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...