| 161 | CachingAssetAccessor::~CachingAssetAccessor() noexcept = default; |
| 162 | |
| 163 | Future<std::shared_ptr<IAssetRequest>> CachingAssetAccessor::get( |
| 164 | const AsyncSystem& asyncSystem, |
| 165 | const std::string& url, |
| 166 | const std::vector<THeader>& headers) { |
| 167 | const int32_t requestSinceLastPrune = ++this->_requestSinceLastPrune; |
| 168 | if (requestSinceLastPrune == this->_requestsPerCachePrune) { |
| 169 | // More requests may have started and incremented _requestSinceLastPrune |
| 170 | // beyond _requestsPerCachePrune before this next line. That's ok. |
| 171 | this->_requestSinceLastPrune = 0; |
| 172 | |
| 173 | CESIUM_TRACE_USE_TRACK_SET(this->_pruneSlots); |
| 174 | asyncSystem.runInThreadPool(this->_cacheThreadPool, [this]() { |
| 175 | this->_pCacheDatabase->prune(); |
| 176 | }); |
| 177 | } |
| 178 | |
| 179 | CESIUM_TRACE_BEGIN_IN_TRACK("IAssetAccessor::get (cached)"); |
| 180 | |
| 181 | const ThreadPool& threadPool = this->_cacheThreadPool; |
| 182 | |
| 183 | return asyncSystem |
| 184 | .runInThreadPool( |
| 185 | this->_cacheThreadPool, |
| 186 | [asyncSystem, |
| 187 | pAssetAccessor = this->_pAssetAccessor, |
| 188 | pCacheDatabase = this->_pCacheDatabase, |
| 189 | pLogger = this->_pLogger, |
| 190 | url = url, |
| 191 | headers = headers, |
| 192 | threadPool]() mutable -> Future<std::shared_ptr<IAssetRequest>> { |
| 193 | std::optional<CacheItem> cacheLookup = |
| 194 | pCacheDatabase->getEntry(url); |
| 195 | if (!cacheLookup) { |
| 196 | // No cache item found, request directly from the server |
| 197 | return pAssetAccessor->get(asyncSystem, url, headers) |
| 198 | .thenInThreadPool( |
| 199 | threadPool, |
| 200 | [pCacheDatabase, pLogger]( |
| 201 | std::shared_ptr<IAssetRequest>&& pCompletedRequest) { |
| 202 | const IAssetResponse* pResponse = |
| 203 | pCompletedRequest->response(); |
| 204 | if (!pResponse) { |
| 205 | return std::move(pCompletedRequest); |
| 206 | } |
| 207 | |
| 208 | const std::optional<ResponseCacheControl> cacheControl = |
| 209 | ResponseCacheControl::parseFromResponseHeaders( |
| 210 | pResponse->headers()); |
| 211 | |
| 212 | if (pResponse && shouldCacheRequest( |
| 213 | *pCompletedRequest, |
| 214 | cacheControl)) { |
| 215 | pCacheDatabase->storeEntry( |
| 216 | calculateCacheKey(*pCompletedRequest), |
| 217 | calculateExpiryTime( |
| 218 | *pCompletedRequest, |
| 219 | cacheControl), |
| 220 | pCompletedRequest->url(), |
nothing calls this directly
no test coverage detected