HeaderBuilder
in package
レスポンスヘッダーの値を組み立てる純粋関数群。
header() の副作用は持たず、送出は Emitter が担う。
Table of Contents
Methods
- buildCacheableHeaders() : array<string|int, string>
- クライアント・中間キャッシュ向けの Cache-Control 系ヘッダーを組み立てる純粋関数。
- canRespondNotModified() : bool
- ページキャッシュから返すときに 304 Not Modified で応答してよいか判定する。
- isPostSizeExceeded() : bool
- POST リクエストのボディサイズが PHP の post_max_size を超過しているか判定する。
- resolveClientCacheHeaders() : array<string|int, string>
- clientCacheHeader() が送出する Cache-Control 等のヘッダー文字列を組み立てる。
- resolvePageCacheHitHeaders() : array<string|int, string>
- ページキャッシュから返すときの Cache-Control 等のヘッダー文字列を組み立てる。
- buildNoStoreHeaders() : array<string|int, string>
- ブラウザ・共有キャッシュのどちらにも保存させないヘッダーを組み立てる。
Methods
buildCacheableHeaders()
クライアント・中間キャッシュ向けの Cache-Control 系ヘッダーを組み立てる純粋関数。
public
buildCacheableHeaders(int $cacheExpireClient[, int|null $lastModifiedTime = null ]) : array<string|int, string>
キャッシュを許可してよいか(ACMS_SID の有無、subscriber_cache 等)の判定は呼び出し側の 責務とし、ここでは行わない。resolveClientCacheHeaders()(動的レンダリング時)と main.php のページキャッシュ配信時の双方から呼ばれる共通実装(CMS-7765 で no-cache を max-age=0 に修正した際、この構築ロジックが2箇所に重複していたため片方が追従できて いなかった。再発防止のためヘッダー構築部分を一本化する)。
Parameters
- $cacheExpireClient : int
- $lastModifiedTime : int|null = null
-
Last-Modified に使う時刻。null の場合 REQUEST_TIME を使う
Return values
array<string|int, string>canRespondNotModified()
ページキャッシュから返すときに 304 Not Modified で応答してよいか判定する。
public
canRespondNotModified(string $ifModifiedSince, int $cacheCreatedAt, bool $hasSession) : bool
resolvePageCacheHitHeaders() がキャッシュ可能なヘッダーを返す場合(未ログインかつ cache_expire_client が 1 以上)に限り、If-Modified-Since がキャッシュの作成日時以降なら 304 にする。
Parameters
- $ifModifiedSince : string
-
If-Modified-Since ヘッダーの値(無いときは空文字)
- $cacheCreatedAt : int
-
ページキャッシュの作成日時
- $hasSession : bool
-
ログイン中のセッションがある
Return values
boolisPostSizeExceeded()
POST リクエストのボディサイズが PHP の post_max_size を超過しているか判定する。
public
isPostSizeExceeded(string $requestMethod, int|null $contentLength, int $postMaxBytes) : bool
post_max_size を超える POST では PHP が $_POST を空にし ACMS_POST も復元できないため、 通常の POST ディスパッチに乗らない。リクエスト段階でこの判定を行い 413 応答へ振り分ける。 ini_get / $_SERVER への依存を持たない純粋な比較として切り出し、単体テスト可能にしている。
Parameters
- $requestMethod : string
-
リクエストメソッド($_SERVER['REQUEST_METHOD'])
- $contentLength : int|null
-
Content-Length(ヘッダ不在時は null)
- $postMaxBytes : int
-
post_max_size をバイトに換算した値(0 以下は無制限)
Return values
bool —超過していれば true
resolveClientCacheHeaders()
clientCacheHeader() が送出する Cache-Control 等のヘッダー文字列を組み立てる。
public
resolveClientCacheHeaders([bool $noCache = false ]) : array<string|int, string>
header() 呼び出しから分離した純粋関数(テスト可能性のため)。
Parameters
- $noCache : bool = false
Return values
array<string|int, string>resolvePageCacheHitHeaders()
ページキャッシュから返すときの Cache-Control 等のヘッダー文字列を組み立てる。
public
resolvePageCacheHitHeaders(int $cacheCreatedAt, bool $hasSession) : array<string|int, string>
ページキャッシュはログイン中の読者(subscriber_cache)にも返るが、読者向けに描画したページを 共有キャッシュ(CDN 等)に載せると未ログインへ配られるため、動的描画時(resolveClientCacheHeaders())と 同じくログイン中は no-store にする。
Parameters
- $cacheCreatedAt : int
-
ページキャッシュの作成日時(Last-Modified に使う)
- $hasSession : bool
-
ログイン中のセッションがある
Return values
array<string|int, string> —cache_expire_client が 0 以下のときは空配列(ヘッダーを付けない)
buildNoStoreHeaders()
ブラウザ・共有キャッシュのどちらにも保存させないヘッダーを組み立てる。
private
buildNoStoreHeaders() : array<string|int, string>