Encabezados HTTP no devueltos en EC2

Tengo una aplicación Spring Boot implementada en 2 instancias EC2 (entornos de producción y producción). Tengo un punto final que se usa para download un file. Se ve así (la aplicación está escrita en Kotlin):

@PostMapping("/download") open fun download(@RequestBody request: DownloadRequest, servletResponse: HttpServletResponse) { val file = getByteArray(request.fileId) servletResponse.outputStream.write(file) servletResponse.contentType = MediaType.APPLICATION_OCTET_STREAM_VALUE servletResponse.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"${request.fileId}.zip\"") } 

Cuando ejecuto una request de descarga en la máquina de ensayo todo está bien. Recupero el file y la respuesta tiene los encabezados establecidos. Estos son los encabezados que puedo ver en Postman:

 Cache-Control →no-cache, no-store, max-age=0, must-revalidate Connection →keep-alive Content-Disposition →attachment; filename="345412.zip" Content-Length →11756 Content-Type →application/octet-stream Date →Tue, 04 Apr 2017 09:04:19 GMT Expires →0 Pragma →no-cache X-Application-Context →application:8081 X-Content-Type-Options →nosniff X-Frame-Options →DENY X-XSS-Protection →1; mode=block 

Cuando realizo la misma request en producción, el cuerpo de respuesta contiene el contenido del file, pero faltan los 2 encabezados que configuré manualmente, "Content-Type" y "Content-Disposition":

 Cache-Control →no-cache, no-store, max-age=0, must-revalidate Connection →keep-alive Content-Length →56665 Date →Tue, 04 Apr 2017 09:06:45 GMT Expires →0 Pragma →no-cache X-Application-Context →application:8081 X-Content-Type-Options →nosniff X-Frame-Options →DENY X-XSS-Protection →1; mode=block 

Ambas máquinas tienen exactamente el mismo JAR desplegado en un contenedor Docker. Ambas llamadas se realizan directamente contra las instancias de EC2, utilizando sus IP privadas, por lo que no se involucra ELB. La configuration de las 2 instancias es idéntica, sin diferencias que pueda encontrar en AWS Console.

¿Sabes lo que podría causar esto? ¿Hay alguna configuration en EC2 que pueda evitar que algunos encabezados HTTP se envíen de vuelta en las respuestas? No puedo encontrar ninguna razón por la cual los encabezados se devuelven en un caso y no en el otro.

El problema se solucionó escribiendo primero los encabezados de respuesta y luego el cuerpo de respuesta:

 @PostMapping("/download") open fun download(@RequestBody request: DownloadRequest, servletResponse: HttpServletResponse) { val file = getByteArray(request.fileId) servletResponse.contentType = MediaType.APPLICATION_OCTET_STREAM_VALUE servletResponse.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"${request.fileId}.zip\"") servletResponse.outputStream.write(file) } 

Si comienza a escribir primero el cuerpo, es posible que los encabezados no estén configurados correctamente. Todavía no estoy seguro de por qué esto se estaba reproduciendo solo en la máquina de producción.

  • Estado de respuesta HTTP SpringBoot Kotlin Api
  • Spring Boot e Hibernate. Manejar la fábrica de sesiones
  • Servicio Spring RESET de arranque: la deserialization de JSON no funciona
  • Usando una constante de Java en un parámetro de anotación de Kotlin
  • Custom Jersey ExceptionMapper en Spring Boot con kotlin
  • Spring Boot with AsyncRestTemplate Netty Client falla
  • ¿Por qué esta aplicación Spring Boot no puede encontrar la página principal?
  • Analizando un object json con un campo dynamic en Kotlin
  • Enfoque correcto para la class de Kotlin inyectada de constructor inmutable
  • Instant no se puede serializar al formatting apropiado incluso con jackson-datatype-jsr310
  • Spring Boot Application: File System Watcher para muchas routes