blob: 4e67b988d1fdc74a6b1e5c877a631ceaa566641e [file] [log] [blame]
// 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 "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(backend.Pass()),
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