Я использую прокси-сервер Spring Cloud и Zuul в качестве шлюза для моей службы RESTful, предоставляемой микрослужбой. Когда я выполняю запрос непосредственно к экземпляру микросервиса, все заголовки предоставляются, как я и ожидал. Однако, когда Zuul передает тот же запрос, заголовок Content-length удаляется. Я провел некоторое исследование по этому поводу и увидел, что Zuul добавляет заголовок «Transfer-Encoding» как «разделенный», и в этом случае заголовок Content-length опущен (Content-Length удаляется, Spring Cloud Netflix: что происходит в ZuulConfiguration с ZuulServlet?).
Однако мне действительно нужно получить «длину контента», предоставляемую моей службой RESTful. Этот запрос также должен быть проксирован Zuul (у меня есть много экземпляров микросервиса, поэтому я не буду обращаться к ним напрямую).
Вот метод в моем микросервисе:
@RequestMapping(value = "/jobresult/{id}", method = RequestMethod.GET)
@Timed
public ResponseEntity<InputStreamResource> downloadJobResult(@PathVariable Long id) {
Job job = jobService.findOne(id);
File file = new File(job.getTargetFile());
try {
return ResponseEntity.ok().contentLength(file.length()).contentType(MediaType.APPLICATION_OCTET_STREAM).body(new InputStreamResource(new FileInputStream(file)));
} catch (FileNotFoundException e) {
log.error(e.getMessage(), e);
}
}
Например, запрос к /api/jobresult/1 правильно предоставляет заголовок «Content-length», но запрос к /service/api/jobresult/1 (маршрутизируемый Zuul) не показывает этот заголовок, а также изменяет «Transfer -Кодирование» на «фрагментированное».