| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "ios/net/http_cache_helper.h" |
| |
| #include <utility> |
| |
| #include "base/bind.h" |
| #include "base/bind_helpers.h" |
| #include "base/callback.h" |
| #include "base/location.h" |
| #include "base/task_runner.h" |
| #include "net/base/sdch_manager.h" |
| #include "net/disk_cache/disk_cache.h" |
| #include "net/http/http_cache.h" |
| #include "net/http/http_network_session.h" |
| #include "net/http/http_transaction_factory.h" |
| #include "net/quic/quic_stream_factory.h" |
| #include "net/url_request/url_request_context.h" |
| #include "net/url_request/url_request_context_getter.h" |
| |
| namespace { |
| |
| // Posts |callback| on |task_runner|. |
| void PostCallback(const scoped_refptr<base::TaskRunner>& task_runner, |
| const net::CompletionCallback& callback, |
| int error) { |
| task_runner->PostTask(FROM_HERE, base::Bind(callback, error)); |
| } |
| |
| // Clears the disk_cache::Backend on the IO thread and deletes |backend|. |
| void DoomHttpCache(scoped_ptr<disk_cache::Backend*> backend, |
| const scoped_refptr<base::TaskRunner>& client_task_runner, |
| const net::CompletionCallback& callback, |
| int error) { |
| // |*backend| may be null in case of error. |
| if (*backend) { |
| (*backend)->DoomAllEntries( |
| base::Bind(&PostCallback, client_task_runner, callback)); |
| } else { |
| client_task_runner->PostTask(FROM_HERE, base::Bind(callback, error)); |
| } |
| } |
| |
| // Clears various caches synchronously and the disk_cache::Backend |
| // asynchronously. |
| void ClearHttpCacheOnIOThread( |
| const scoped_refptr<net::URLRequestContextGetter>& getter, |
| const scoped_refptr<base::TaskRunner>& client_task_runner, |
| const net::CompletionCallback& callback) { |
| net::HttpCache* http_cache = |
| getter->GetURLRequestContext()->http_transaction_factory()->GetCache(); |
| |
| // Clear QUIC server information from memory and the disk cache. |
| http_cache->GetSession() |
| ->quic_stream_factory() |
| ->ClearCachedStatesInCryptoConfig(); |
| |
| // Clear SDCH dictionary state. |
| net::SdchManager* sdch_manager = |
| getter->GetURLRequestContext()->sdch_manager(); |
| // The test is probably overkill, since chrome should always have an |
| // SdchManager. But in general the URLRequestContext is *not* |
| // guaranteed to have an SdchManager, so checking is wise. |
| if (sdch_manager) |
| sdch_manager->ClearData(); |
| |
| scoped_ptr<disk_cache::Backend*> backend(new disk_cache::Backend*(nullptr)); |
| disk_cache::Backend** backend_ptr = backend.get(); |
| net::CompletionCallback doom_callback = |
| base::Bind(&DoomHttpCache, base::Passed(std::move(backend)), |
| client_task_runner, callback); |
| |
| int rv = http_cache->GetBackend(backend_ptr, doom_callback); |
| |
| if (rv != net::ERR_IO_PENDING) { |
| // GetBackend doesn't call the callback if it completes synchronously, so |
| // call it directly here. |
| doom_callback.Run(rv); |
| } |
| } |
| |
| } // namespace |
| |
| namespace net { |
| |
| void ClearHttpCache(const scoped_refptr<net::URLRequestContextGetter>& getter, |
| const scoped_refptr<base::TaskRunner>& network_task_runner, |
| const net::CompletionCallback& callback) { |
| network_task_runner->PostTask( |
| FROM_HERE, base::Bind(&ClearHttpCacheOnIOThread, getter, |
| base::ThreadTaskRunnerHandle::Get(), callback)); |
| } |
| |
| } // namespace net |