@@ -90,16 +90,49 @@ void CacheEntry::close_and_destroy_cache_entry()
9090 m_disk_cache.cache_entry_closed ({}, *this );
9191}
9292
93- ErrorOr<NonnullOwnPtr<CacheEntryWriter>> CacheEntryWriter::create (DiskCache& disk_cache, CacheIndex& index, u64 cache_key, String url, u32 status_code, Optional<String> reason_phrase, HTTP::HeaderMap const & headers, UnixDateTime request_time)
93+ ErrorOr<NonnullOwnPtr<CacheEntryWriter>> CacheEntryWriter::create (DiskCache& disk_cache, CacheIndex& index, u64 cache_key, String url, UnixDateTime request_time)
9494{
9595 auto path = path_for_cache_key (disk_cache.cache_directory (), cache_key);
9696
9797 auto unbuffered_file = TRY (Core::File::open (path.string (), Core::File::OpenMode::Write));
9898 auto file = TRY (Core::OutputBufferedFile::create (move (unbuffered_file)));
9999
100100 CacheHeader cache_header;
101+ cache_header.url_size = url.byte_count ();
102+ cache_header.url_hash = url.hash ();
103+
104+ return adopt_own (*new CacheEntryWriter { disk_cache, index, cache_key, move (url), move (path), move (file), cache_header, request_time });
105+ }
106+
107+ CacheEntryWriter::CacheEntryWriter (DiskCache& disk_cache, CacheIndex& index, u64 cache_key, String url, LexicalPath path, NonnullOwnPtr<Core::OutputBufferedFile> file, CacheHeader cache_header, UnixDateTime request_time)
108+ : CacheEntry(disk_cache, index, cache_key, move(url), move(path), cache_header)
109+ , m_file(move(file))
110+ , m_request_time(request_time)
111+ , m_response_time(UnixDateTime::now())
112+ {
113+ }
114+
115+ ErrorOr<void > CacheEntryWriter::write_headers (u32 status_code, Optional<String> reason_phrase, HTTP::HeaderMap const & headers)
116+ {
117+ if (m_marked_for_deletion) {
118+ close_and_destroy_cache_entry ();
119+ return Error::from_string_literal (" Cache entry has been deleted" );
120+ }
121+
122+ m_cache_header.status_code = status_code;
123+
124+ if (reason_phrase.has_value ()) {
125+ m_cache_header.reason_phrase_size = reason_phrase->byte_count ();
126+ m_cache_header.reason_phrase_hash = reason_phrase->hash ();
127+ }
101128
102129 auto result = [&]() -> ErrorOr<void > {
130+ if (!is_cacheable (status_code, headers))
131+ return Error::from_string_literal (" Response is not cacheable" );
132+
133+ if (auto freshness = calculate_freshness_lifetime (headers); freshness.is_negative () || freshness.is_zero ())
134+ return Error::from_string_literal (" Response has already expired" );
135+
103136 StringBuilder builder;
104137 auto headers_serializer = TRY (JsonArraySerializer<>::try_create (builder));
105138
@@ -114,41 +147,29 @@ ErrorOr<NonnullOwnPtr<CacheEntryWriter>> CacheEntryWriter::create(DiskCache& dis
114147 }
115148
116149 TRY (headers_serializer.finish ());
117-
118- cache_header.url_size = url.byte_count ();
119- cache_header.url_hash = url.hash ();
120-
121- cache_header.status_code = status_code;
122- cache_header.reason_phrase_size = reason_phrase.has_value () ? reason_phrase->byte_count () : 0 ;
123- cache_header.reason_phrase_hash = reason_phrase.has_value () ? reason_phrase->hash () : 0 ;
124-
125150 auto serialized_headers = builder.string_view ();
126- cache_header .headers_size = serialized_headers.length ();
127- cache_header .headers_hash = serialized_headers.hash ();
151+ m_cache_header .headers_size = serialized_headers.length ();
152+ m_cache_header .headers_hash = serialized_headers.hash ();
128153
129- TRY (file ->write_value (cache_header ));
130- TRY (file ->write_until_depleted (url ));
154+ TRY (m_file ->write_value (m_cache_header ));
155+ TRY (m_file ->write_until_depleted (m_url ));
131156 if (reason_phrase.has_value ())
132- TRY (file ->write_until_depleted (*reason_phrase));
133- TRY (file ->write_until_depleted (serialized_headers));
157+ TRY (m_file ->write_until_depleted (*reason_phrase));
158+ TRY (m_file ->write_until_depleted (serialized_headers));
134159
135160 return {};
136161 }();
137162
138163 if (result.is_error ()) {
139- (void )FileSystem::remove (path.string (), FileSystem::RecursionMode::Disallowed);
164+ dbgln (" \033 [31;1mUnable to write headers to cache entry for\033 [0m {}: {}" , m_url, result.error ());
165+
166+ remove ();
167+ close_and_destroy_cache_entry ();
168+
140169 return result.release_error ();
141170 }
142171
143- return adopt_own (*new CacheEntryWriter { disk_cache, index, cache_key, move (url), path, move (file), cache_header, request_time });
144- }
145-
146- CacheEntryWriter::CacheEntryWriter (DiskCache& disk_cache, CacheIndex& index, u64 cache_key, String url, LexicalPath path, NonnullOwnPtr<Core::OutputBufferedFile> file, CacheHeader cache_header, UnixDateTime request_time)
147- : CacheEntry(disk_cache, index, cache_key, move(url), move(path), cache_header)
148- , m_file(move(file))
149- , m_request_time(request_time)
150- , m_response_time(UnixDateTime::now())
151- {
172+ return {};
152173}
153174
154175ErrorOr<void > CacheEntryWriter::write_data (ReadonlyBytes data)
@@ -159,7 +180,7 @@ ErrorOr<void> CacheEntryWriter::write_data(ReadonlyBytes data)
159180 }
160181
161182 if (auto result = m_file->write_until_depleted (data); result.is_error ()) {
162- dbgln (" \033 [31;1mUnable to write to cache entry for\033 [0m {}: {}" , m_url, result.error ());
183+ dbgln (" \033 [31;1mUnable to write data to cache entry for\033 [0m {}: {}" , m_url, result.error ());
163184
164185 remove ();
165186 close_and_destroy_cache_entry ();
0 commit comments