Как настроить HTTPServer для использования длины контента, а не передачи кодировки: chunked?

Я использую объект Java-сервера 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 ответ

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

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

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

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

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

Другие вопросы по тегам