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.

  • Jackson ready only collections
  • Referencia no resuelta: SpringExtension utilizando @ExtendWith anotación
  • Kotlin: ejecuta una testing de integración, el error `diversión principal ya está definido`
  • Spring Boot: no puede include recurso estático
  • Seguridad de spring. Página de inicio de session multilenguaje basada en url
  • Usando una constante de Java en un parámetro de anotación de Kotlin
  • Kotlin + SpringBoot 2.0.0-M4 falló en el context de la aplicación de carga (BeanCreationException)
  • El controller de exception Spring Boot @ControllerAdvice no se activa
  • SpringBoot ArrayIndexOutOfBoundsException MethodParameter.getGenericParameterType
  • Spring Boot with AsyncRestTemplate Netty Client falla
  • Estado de respuesta HTTP SpringBoot Kotlin Api