Моя первоначальная цель состояла в том, чтобы проверить передачу 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 и делиться результатами. Но это может занять некоторое время.
Связанный: