Моя первоначальная цель состояла в том, чтобы проверить передачу chunked HTTP. Но случайно обнаружил эту несогласованность.
API предназначен для возврата файла клиенту. Я использую методы HEAD и GET. Возвращаются разные заголовки.
Для GET, я получаю эти заголовки: (Это то, что я ожидал.)
Для HEAD, я получаю следующие заголовки:
В соответствии с этот поток, HEAD и GET СЛЕДУЕТ возвращать одинаковые заголовки, но не обязательно.
Мой вопрос:
Если используется Transfer-Encoding: chunked, потому что файл динамически передается клиенту, а сервер Tomcat не может заранее знать его размер, как Tomcat знает Content-Length, когда используется метод HEAD? Выполняет ли Tomcat только dry-run обработчик и подсчитывает все байты файлов? Почему он просто не возвращает тот же заголовок Transfer-Encoding: chunked?
Ниже мой API RESTful реализован с Spring веб-MVC:
@RestController
public class ChunkedTransferAPI {
@Autowired
ServletContext servletContext;
@RequestMapping(value = "bootfile.efi", method = { RequestMethod.GET, RequestMethod.HEAD })
public void doHttpBoot(HttpServletResponse response) {
String filename = "/bootfile.efi";
try {
ServletOutputStream output = response.getOutputStream();
InputStream input = servletContext.getResourceAsStream(filename);
BufferedInputStream bufferedInput = new BufferedInputStream(input);
int datum = bufferedInput.read();
while (datum != -1) {
output.write(datum);
datum = bufferedInput.read();
}
output.flush();
output.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
ДОБАВИТЬ 1
В моем коде я явно не добавлял заголовки, тогда должен быть Tomcat, который добавляет заголовки Content-Length и Transfer-Encoding по своему усмотрению.
Итак, какие правила для Tomcat определяют, какие заголовки отправлять?
ADD 2
Возможно, это связано с тем, как работает Tomcat. Надеюсь, кто-то может пролить свет здесь. В противном случае я буду отлаживать источник Tomcat 8 и делиться результатами. Но это может занять некоторое время.
Связанный:

