summaryrefslogtreecommitdiffstats
path: root/ios/net/http_cache_helper.cc
blob: 1702cace9014152953903b6545c6d084709fe827 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
// 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