[WK2] We should not even try the network cache for non-HTTP protocol requests
[WebKit-https.git] / Source / WebKit2 / NetworkProcess / cache / NetworkCache.h
1 /*
2  * Copyright (C) 2014-2015 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef NetworkCache_h
27 #define NetworkCache_h
28
29 #if ENABLE(NETWORK_CACHE)
30
31 #include "NetworkCacheStorage.h"
32 #include "ShareableResource.h"
33 #include <WebCore/ResourceResponse.h>
34 #include <wtf/text/WTFString.h>
35
36 namespace WebCore {
37 class ResourceRequest;
38 class SharedBuffer;
39 class URL;
40 }
41
42 namespace WebKit {
43 namespace NetworkCache {
44
45 class Cache;
46 class Statistics;
47
48 Cache& singleton();
49
50 struct MappedBody {
51 #if ENABLE(SHAREABLE_RESOURCE)
52     RefPtr<ShareableResource> shareableResource;
53     ShareableResource::Handle shareableResourceHandle;
54 #endif
55 };
56
57 struct Entry {
58     Storage::Entry storageEntry;
59     WebCore::ResourceResponse response;
60     RefPtr<WebCore::SharedBuffer> buffer;
61 #if ENABLE(SHAREABLE_RESOURCE)
62     ShareableResource::Handle shareableResourceHandle;
63 #endif
64     bool needsRevalidation;
65 };
66
67 enum class RetrieveDecision {
68     Yes,
69     NoDueToHTTPMethod,
70     NoDueToConditionalRequest,
71     NoDueToReloadIgnoringCache
72 };
73
74 enum class StoreDecision {
75     Yes,
76     NoDueToProtocol,
77     NoDueToHTTPMethod,
78     NoDueToAttachmentResponse,
79     NoDueToNoStoreResponse,
80     NoDueToHTTPStatusCode
81 };
82
83 enum class CachedEntryReuseFailure {
84     None,
85     VaryingHeaderMismatch,
86     MissingValidatorFields,
87     Other,
88 };
89
90 class Cache {
91     WTF_MAKE_NONCOPYABLE(Cache);
92     friend class WTF::NeverDestroyed<Cache>;
93 public:
94     bool initialize(const String& cachePath, bool enableEfficacyLogging);
95     void setMaximumSize(size_t);
96
97     bool isEnabled() const { return !!m_storage; }
98
99     // Completion handler may get called back synchronously on failure.
100     void retrieve(const WebCore::ResourceRequest&, uint64_t webPageID, std::function<void (std::unique_ptr<Entry>)>);
101     void store(const WebCore::ResourceRequest&, const WebCore::ResourceResponse&, RefPtr<WebCore::SharedBuffer>&&, std::function<void (MappedBody&)>);
102     void update(const WebCore::ResourceRequest&, const Entry&, const WebCore::ResourceResponse& validatingResponse);
103
104     void traverse(std::function<void (const Entry*)>&&);
105     void remove(const Entry&);
106
107     void clear();
108
109     void dumpContentsToFile();
110
111     String storagePath() const;
112
113 private:
114     Cache() = default;
115     ~Cache() = delete;
116
117     String dumpFilePath() const;
118
119     std::unique_ptr<Storage> m_storage;
120     std::unique_ptr<Statistics> m_statistics;
121 };
122
123 }
124 }
125 #endif
126 #endif