프록시를 통한 불완전한 이미지: Netty 쓰기 완료 확인
프록시를 통해 이미지가 불완전하게 도착하면, 비동기 응답 쓰기가 완료되기 전에 원본 서버가 Netty 채널을 닫는지 확인하십시오.
이미지는 빠른 직접 연결에서는 제대로 동작하지만, 더 느린 포워드 프록시를 통하면 불완전합니다. 가능한 원인 중 하나는 응답이 아직 쓰이고 있는 동안 원본 서버가 연결을 닫는 것입니다.
Netty I/O는 비동기입니다. writeAndFlush에서 반환되었다고 해서 그 작업이 완료된 것은 아닙니다. 따라서 아직 대기열에 바이트가 남아 있는 응답에는 이 순서가 안전하지 않습니다.
ctx.writeAndFlush(response);
ctx.close();
HTTP 교환이 마지막 응답 메시지 이후 의도적으로 닫히는 경우, 닫기를 해당 쓰기의 future에 연결하십시오.
ctx.writeAndFlush(finalResponseMessage)
.addListener(ChannelFutureListener.CLOSE);
이 조각은 응답이 이미 올바르게 구성되고 프레이밍되었다고 가정합니다. 스트리밍 본문의 경우 헤더 쓰기가 아니라 마지막 메시지의 완료를 사용하십시오. 지속적인 HTTP 연결에서는 응답이 끝났다는 이유만으로 닫기를 추가하지 마십시오.
애플리케이션의 일반적인 오류 처리의 일부로 future의 실패를 검사하십시오. 완료에는 실패와 취소가 포함되므로 완료만으로는 브라우저로부터의 전달 확인이 아닙니다.
유용한 비교는 각 경로에서의 전체 응답 길이와 쓰기 결과입니다. 프록시는 타이밍을 충분히 바꿔 기존의 수명 주기 오류를 드러낼 수 있지만, 그 존재가 프록시의 압축기나 캐시가 바이트를 버렸다는 것을 증명하지는 않습니다.