// 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 "base/threading/thread_task_runner_handle.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"
#include "url/gurl.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(std::unique_ptr<disk_cache::Backend*> backend,
                   const scoped_refptr<base::TaskRunner>& client_task_runner,
                   const base::Time& delete_begin,
                   const base::Time& delete_end,
                   const net::CompletionCallback& callback,
                   int error) {
  // |*backend| may be null in case of error.
  if (*backend) {
    const int rv = (*backend)->DoomEntriesBetween(
        delete_begin, delete_end,
        base::Bind(&PostCallback, client_task_runner, callback));
    // DoomEntriesBetween does not invoke callback unless rv is ERR_IO_PENDING.
    if (rv != net::ERR_IO_PENDING) {
      client_task_runner->PostTask(FROM_HERE, base::BindOnce(callback, rv));
    }
  } 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 base::Time& delete_begin,
    const base::Time& delete_end,
    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(base::Callback<bool(const GURL&)>());

  std::unique_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, delete_begin, delete_end, callback);

  const 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 base::Time& delete_begin,
                    const base::Time& delete_end,
                    const net::CompletionCallback& callback) {
  DCHECK(delete_end != base::Time());
  network_task_runner->PostTask(
      FROM_HERE, base::Bind(&ClearHttpCacheOnIOThread, getter,
                            base::ThreadTaskRunnerHandle::Get(), delete_begin,
                            delete_end, callback));
}

}  // namespace net
