Add specialization for encoding/decoding WebCore::CertificateInfos in the Network...
[WebKit-https.git] / Source / WebKit2 / NetworkProcess / cache / NetworkCacheStorage.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 NetworkCacheStorage_h
27 #define NetworkCacheStorage_h
28
29 #if ENABLE(NETWORK_CACHE)
30
31 #include "NetworkCacheBlobStorage.h"
32 #include "NetworkCacheData.h"
33 #include "NetworkCacheKey.h"
34 #include <WebCore/Timer.h>
35 #include <wtf/BloomFilter.h>
36 #include <wtf/Deque.h>
37 #include <wtf/Function.h>
38 #include <wtf/HashSet.h>
39 #include <wtf/Optional.h>
40 #include <wtf/WorkQueue.h>
41 #include <wtf/text/WTFString.h>
42
43 namespace WebKit {
44 namespace NetworkCache {
45
46 class IOChannel;
47
48 class Storage {
49     WTF_MAKE_NONCOPYABLE(Storage);
50 public:
51     static std::unique_ptr<Storage> open(const String& cachePath);
52
53     struct Record {
54         WTF_MAKE_FAST_ALLOCATED;
55     public:
56         Key key;
57         std::chrono::system_clock::time_point timeStamp;
58         Data header;
59         Data body;
60     };
61     // This may call completion handler synchronously on failure.
62     typedef std::function<bool (std::unique_ptr<Record>)> RetrieveCompletionHandler;
63     void retrieve(const Key&, unsigned priority, RetrieveCompletionHandler&&);
64
65     typedef Function<void (const Data& mappedBody)> MappedBodyHandler;
66     void store(const Record&, MappedBodyHandler&&);
67
68     void remove(const Key&);
69     void clear(const String& type, std::chrono::system_clock::time_point modifiedSinceTime, std::function<void ()>&& completionHandler);
70
71     struct RecordInfo {
72         size_t bodySize;
73         double worth; // 0-1 where 1 is the most valuable.
74         unsigned bodyShareCount;
75         String bodyHash;
76     };
77     enum TraverseFlag {
78         ComputeWorth = 1 << 0,
79         ShareCount = 1 << 1,
80     };
81     typedef unsigned TraverseFlags;
82     typedef Function<void (const Record*, const RecordInfo&)> TraverseHandler;
83     // Null record signals end.
84     void traverse(const String& type, TraverseFlags, TraverseHandler&&);
85
86     void setCapacity(size_t);
87     size_t capacity() const { return m_capacity; }
88     size_t approximateSize() const;
89
90     static const unsigned version = 9;
91 #if PLATFORM(MAC)
92     /// Allow the last stable version of the cache to co-exist with the latest development one.
93     static const unsigned lastStableVersion = 9;
94 #endif
95
96     String basePath() const;
97     String versionPath() const;
98     String recordsPath() const;
99
100     ~Storage();
101
102 private:
103     Storage(const String& directoryPath);
104
105     String recordDirectoryPathForKey(const Key&) const;
106     String recordPathForKey(const Key&) const;
107     String blobPathForKey(const Key&) const;
108
109     void synchronize();
110     void deleteOldVersions();
111     void shrinkIfNeeded();
112     void shrink();
113
114     struct ReadOperation;
115     void dispatchReadOperation(std::unique_ptr<ReadOperation>);
116     void dispatchPendingReadOperations();
117     void finishReadOperation(ReadOperation&);
118     void cancelAllReadOperations();
119
120     struct WriteOperation;
121     void dispatchWriteOperation(std::unique_ptr<WriteOperation>);
122     void dispatchPendingWriteOperations();
123     void finishWriteOperation(WriteOperation&);
124
125     Optional<BlobStorage::Blob> storeBodyAsBlob(WriteOperation&);
126     Data encodeRecord(const Record&, Optional<BlobStorage::Blob>);
127     void readRecord(ReadOperation&, const Data&);
128
129     void updateFileModificationTime(const String& path);
130     void removeFromPendingWriteOperations(const Key&);
131
132     WorkQueue& ioQueue() { return m_ioQueue.get(); }
133     WorkQueue& backgroundIOQueue() { return m_backgroundIOQueue.get(); }
134     WorkQueue& serialBackgroundIOQueue() { return m_serialBackgroundIOQueue.get(); }
135
136     bool mayContain(const Key&) const;
137     bool mayContainBlob(const Key&) const;
138
139     void addToRecordFilter(const Key&);
140
141     const String m_basePath;
142     const String m_recordsPath;
143
144     size_t m_capacity { std::numeric_limits<size_t>::max() };
145     size_t m_approximateRecordsSize { 0 };
146
147     // 2^18 bit filter can support up to 26000 entries with false positive rate < 1%.
148     using ContentsFilter = BloomFilter<18>;
149     std::unique_ptr<ContentsFilter> m_recordFilter;
150     std::unique_ptr<ContentsFilter> m_blobFilter;
151
152     bool m_synchronizationInProgress { false };
153     bool m_shrinkInProgress { false };
154
155     Vector<Key::HashType> m_recordFilterHashesAddedDuringSynchronization;
156     Vector<Key::HashType> m_blobFilterHashesAddedDuringSynchronization;
157
158     static const int maximumRetrievePriority = 4;
159     Deque<std::unique_ptr<ReadOperation>> m_pendingReadOperationsByPriority[maximumRetrievePriority + 1];
160     HashSet<std::unique_ptr<ReadOperation>> m_activeReadOperations;
161     WebCore::Timer m_readOperationTimeoutTimer;
162
163     Deque<std::unique_ptr<WriteOperation>> m_pendingWriteOperations;
164     HashSet<std::unique_ptr<WriteOperation>> m_activeWriteOperations;
165     WebCore::Timer m_writeOperationDispatchTimer;
166
167     struct TraverseOperation;
168     HashSet<std::unique_ptr<TraverseOperation>> m_activeTraverseOperations;
169
170     Ref<WorkQueue> m_ioQueue;
171     Ref<WorkQueue> m_backgroundIOQueue;
172     Ref<WorkQueue> m_serialBackgroundIOQueue;
173
174     BlobStorage m_blobStorage;
175 };
176
177 // FIXME: Remove, used by NetworkCacheStatistics only.
178 void traverseRecordsFiles(const String& recordsPath, const String& type, const std::function<void (const String& fileName, const String& hashString, const String& type, bool isBodyBlob, const String& recordDirectoryPath)>&);
179
180 }
181 }
182 #endif
183 #endif