44 * SPDX-License-Identifier: BSD-2-Clause
55 */
66
7- #include < AK/JsonArray.h>
8- #include < AK/JsonArraySerializer.h>
9- #include < AK/JsonObject.h>
10- #include < AK/JsonObjectSerializer.h>
11- #include < AK/JsonValue.h>
127#include < AK/ScopeGuard.h>
138#include < LibCore/Notifier.h>
149#include < LibCore/System.h>
@@ -35,8 +30,6 @@ ErrorOr<CacheHeader> CacheHeader::read_from_stream(Stream& stream)
3530 header.status_code = TRY (stream.read_value <u32 >());
3631 header.reason_phrase_size = TRY (stream.read_value <u32 >());
3732 header.reason_phrase_hash = TRY (stream.read_value <u32 >());
38- header.headers_size = TRY (stream.read_value <u32 >());
39- header.headers_hash = TRY (stream.read_value <u32 >());
4033 return header;
4134}
4235
@@ -49,8 +42,6 @@ ErrorOr<void> CacheHeader::write_to_stream(Stream& stream) const
4942 TRY (stream.write_value (status_code));
5043 TRY (stream.write_value (reason_phrase_size));
5144 TRY (stream.write_value (reason_phrase_hash));
52- TRY (stream.write_value (headers_size));
53- TRY (stream.write_value (headers_hash));
5445 return {};
5546}
5647
@@ -112,7 +103,7 @@ CacheEntryWriter::CacheEntryWriter(DiskCache& disk_cache, CacheIndex& index, u64
112103{
113104}
114105
115- ErrorOr<void > CacheEntryWriter::write_headers (u32 status_code, Optional<String> reason_phrase, HTTP::HeaderMap const & headers)
106+ ErrorOr<void > CacheEntryWriter::write_status_and_reason (u32 status_code, Optional<String> reason_phrase, HTTP::HeaderMap const & headers)
116107{
117108 if (m_marked_for_deletion) {
118109 close_and_destroy_cache_entry ();
@@ -133,35 +124,16 @@ ErrorOr<void> CacheEntryWriter::write_headers(u32 status_code, Optional<String>
133124 if (auto freshness = calculate_freshness_lifetime (headers); freshness.is_negative () || freshness.is_zero ())
134125 return Error::from_string_literal (" Response has already expired" );
135126
136- StringBuilder builder;
137- auto headers_serializer = TRY (JsonArraySerializer<>::try_create (builder));
138-
139- for (auto const & header : headers.headers ()) {
140- if (is_header_exempted_from_storage (header.name ))
141- continue ;
142-
143- auto header_serializer = TRY (headers_serializer.add_object ());
144- TRY (header_serializer.add (" name" sv, header.name ));
145- TRY (header_serializer.add (" value" sv, header.value ));
146- TRY (header_serializer.finish ());
147- }
148-
149- TRY (headers_serializer.finish ());
150- auto serialized_headers = builder.string_view ();
151- m_cache_header.headers_size = serialized_headers.length ();
152- m_cache_header.headers_hash = serialized_headers.hash ();
153-
154127 TRY (m_file->write_value (m_cache_header));
155128 TRY (m_file->write_until_depleted (m_url));
156129 if (reason_phrase.has_value ())
157130 TRY (m_file->write_until_depleted (*reason_phrase));
158- TRY (m_file->write_until_depleted (serialized_headers));
159131
160132 return {};
161133 }();
162134
163135 if (result.is_error ()) {
164- dbgln (" \033 [31;1mUnable to write headers to cache entry for\033 [0m {}: {}" , m_url, result.error ());
136+ dbgln (" \033 [31;1mUnable to write status/reason to cache entry for\033 [0m {}: {}" , m_url, result.error ());
165137
166138 remove ();
167139 close_and_destroy_cache_entry ();
@@ -194,7 +166,7 @@ ErrorOr<void> CacheEntryWriter::write_data(ReadonlyBytes data)
194166 return {};
195167}
196168
197- ErrorOr<void > CacheEntryWriter::flush ()
169+ ErrorOr<void > CacheEntryWriter::flush (HTTP::HeaderMap headers )
198170{
199171 ScopeGuard guard { [&]() { close_and_destroy_cache_entry (); } };
200172
@@ -208,13 +180,13 @@ ErrorOr<void> CacheEntryWriter::flush()
208180 return result.release_error ();
209181 }
210182
211- m_index.create_entry (m_cache_key, m_url, m_cache_footer.data_size , m_request_time, m_response_time);
183+ m_index.create_entry (m_cache_key, m_url, move (headers), m_cache_footer.data_size , m_request_time, m_response_time);
212184
213185 dbgln (" \033 [34;1mFinished caching\033 [0m {} ({} bytes)" , m_url, m_cache_footer.data_size );
214186 return {};
215187}
216188
217- ErrorOr<NonnullOwnPtr<CacheEntryReader>> CacheEntryReader::create (DiskCache& disk_cache, CacheIndex& index, u64 cache_key, u64 data_size)
189+ ErrorOr<NonnullOwnPtr<CacheEntryReader>> CacheEntryReader::create (DiskCache& disk_cache, CacheIndex& index, u64 cache_key, HTTP::HeaderMap headers, u64 data_size)
218190{
219191 auto path = path_for_cache_key (disk_cache.cache_directory (), cache_key);
220192
@@ -225,7 +197,6 @@ ErrorOr<NonnullOwnPtr<CacheEntryReader>> CacheEntryReader::create(DiskCache& dis
225197
226198 String url;
227199 Optional<String> reason_phrase;
228- HTTP::HeaderMap headers;
229200
230201 auto result = [&]() -> ErrorOr<void > {
231202 cache_header = TRY (file->read_value <CacheHeader>());
@@ -245,28 +216,6 @@ ErrorOr<NonnullOwnPtr<CacheEntryReader>> CacheEntryReader::create(DiskCache& dis
245216 return Error::from_string_literal (" Reason phrase hash mismatch" );
246217 }
247218
248- auto serialized_headers = TRY (String::from_stream (*file, cache_header.headers_size ));
249- if (serialized_headers.hash () != cache_header.headers_hash )
250- return Error::from_string_literal (" HTTP headers hash mismatch" );
251-
252- auto json_headers = TRY (JsonValue::from_string (serialized_headers));
253- if (!json_headers.is_array ())
254- return Error::from_string_literal (" Expected HTTP headers to be a JSON array" );
255-
256- TRY (json_headers.as_array ().try_for_each ([&](JsonValue const & header) -> ErrorOr<void > {
257- if (!header.is_object ())
258- return Error::from_string_literal (" Expected headers entry to be a JSON object" );
259-
260- auto name = header.as_object ().get_string (" name" sv);
261- auto value = header.as_object ().get_string (" value" sv);
262-
263- if (!name.has_value () || !value.has_value ())
264- return Error::from_string_literal (" Missing/invalid data in headers entry" );
265-
266- headers.set (name->to_byte_string (), value->to_byte_string ());
267- return {};
268- }));
269-
270219 return {};
271220 }();
272221
@@ -275,7 +224,7 @@ ErrorOr<NonnullOwnPtr<CacheEntryReader>> CacheEntryReader::create(DiskCache& dis
275224 return result.release_error ();
276225 }
277226
278- auto data_offset = sizeof (CacheHeader) + cache_header.url_size + cache_header.reason_phrase_size + cache_header. headers_size ;
227+ auto data_offset = sizeof (CacheHeader) + cache_header.url_size + cache_header.reason_phrase_size ;
279228
280229 return adopt_own (*new CacheEntryReader { disk_cache, index, cache_key, move (url), move (path), move (file), fd, cache_header, move (reason_phrase), move (headers), data_offset, data_size });
281230}
0 commit comments