ヘッダー名 | 説明 |
---|---|
Transfer-Encoding: chunked |
デフォルトで付与されやすい。レスポンスボディがストリーミング(サイズ不明)だとNettyが自動で追加。 |
Date |
HTTP/1.1仕様に基づいてNettyが追加。 |
Content-Length |
明示的に指定すれば付く。しなければ Transfer-Encoding: chunked で代用。 |
Connection: keep-alive |
HTTP/1.1ではデフォルトで追加される。明示的に close を指定しない限り。 |
Content-Type |
明示的に設定しない限りは通常付与されない。が、Spring WebFlux 経由だと推定で追加されることがある。 |
Server: ReactorNetty/xxx |
Nettyのバージョンによって異なるが、自動で付加される。明示的に削除・変更可能。 |
Tomcatが Transfer-Encoding: chunked を自動設定する条件
HTTP/1.1で、Content-Length が明示されていない場合
Servletレスポンスで Content-Length を設定しない(または設定できない)と、TomcatはHTTP/1.1の仕様に従って Transfer-Encoding: chunked を自動付加します。
Spring MVC、Spriing FrameworkのWeb Client(+Reactor-Netty)、Tomcatの構成の場合にTransfer-Encoding: chunked の2重設定を防ぐには
・Spriing FrameworkのWeb Client(+Reactor-Netty)で連携先のレスポンスを受け取ったときにContent-Lengthがなかった場合にレスポンスヘッダーにTransfer-Encoding: chunked
を自動付与
・その場合、Spring MVCは、以下のようにTransfer-Encodingをヘッダーを削除する必要がある
// Transfer-Encodingを削除
headers.remove(HttpHeaders.TRANSFER_ENCODING);
その後、tomcatがTransfer-Encoding: chunked
を付与する
tomcatがTransfer-Encoding: chunked
を付与しないようにするには、Content-Lengthを明示的に設定
// Transfer-Encodingを削除
headers.remove(HttpHeaders.TRANSFER_ENCODING);
// Content-Length を明示(chunkedを無効化)
headers.setContentLength(body != null ? body.length : 0);