Как настроить HTTPServer для использования длины контента, а не передачи кодировки: chunked? - PullRequest
1 голос
/ 03 августа 2011

Я использую объект HTTP-сервера Java с веб-службой, реализованной WebServiceProvider.Я вижу, что независимо от запроса клиента ответ разбивается на части, и мне нужно, чтобы он содержал длину контента.так что я предполагаю, что проблема в сервере, а не в провайдере веб-сервера, верно?и как я могу настроить заголовок http для использования длины контента, а не chunked?

    HttpServer m_server = HttpServer.create();
    Endpoint ep= Endpoint.create(new ep());
    HttpContext epContext = m_server.createContext("/DownloadFile");
    ep.publish(downloadFileContext);

1 Ответ

0 голосов
/ 03 августа 2011

Я полагаю, вы говорите о HTTPS-сервере com.sun.net.httpserver.Я также предполагаю, что вы подключаете сервер к сервису с помощью вызова Endpoint.publish, используя какого-либо поставщика услуг, который поддерживает HTTPServer.

Ключ находится в HttpExchange.sendResponseHeaders метод:

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

Таким образом, пока обработчик передает положительное значение для responseLength, используется Content-Length.Конечно, чтобы сделать это, ему нужно будет знать, сколько данных он собирается отправить заранее, чего вполне может и не быть.Боюсь, зависит это от реализации привязки или нет.Я не верю, что это стандартизировано - действительно, я не верю, что WebServiceProvider / HTTPServer вообще стандартизирован.

Однако, даже если ваш провайдер отказывается сотрудничать, у вас есть выход: напишите Фильтр , который добавляет буферизацию и добавляет ее в HttpContext, который вы используете для публикации сервиса.Я думаю, что для этого вам нужно написать реализацию HttpExchange , которая буферизует записанные в него данные, передаст эту цепочку фильтров, чтобы обработчик записал свой ответ, а затем, когда он вернется, напишите буферизованное содержимое, установив responseLength, когда это так.

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