[HttpKernel] Fix regression where Store does not return response body correctly #37182
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Since #36833, the
Store
no longer uses or trusts theX-Content-Digest
header present on a response, since that may come (in the case of usingCachingHttpClient
) from upstream HTTP sources. Instead, theX-Content-Digest
is re-computed every time a response is written by theStore
.Additionally, the
Store
is implemented in a way that when restoring responses, it does not actually load the response body, but just keeps the file path to the content on disk in another internal header calledX-Body-File
. It is up to others (HttpCache
, for example) to actually load the content from there. For reasons I could not determine, the file path is also set as the response body.When the
HttpCache
performs revalidations, it may happen that it wants theStore
to persist a previously restored response. In that case, theStore
fails to honor its ownX-Body-File
header. Instead, it would compute (since #36833) theX-Content-Digest
, which now is a hash of the cache file path.So, we end up with a response that still carries
X-Body-File
for the original, correct response. Since theHttpCache
honors this value, we don't immediately notice that. But inside theStore
, the request is now associated with the new (bogus) content entry.It takes another round of looking up the content in the
Store
to now get a response where theX-Body-File
also points to the wrong content entry.Although I feel a bit uncomfortable with trusting headers that seemingly need to be evaluated in different classes and may come from elsewhere, my suggestion is to skip the write inside
Store
ifX-Body-File
andX-Content-Digest
are both present and consistent with each other.Additionally, a
file_exists
check could be added to provide additional assertions, at the cost of accessing the filesystem.