Move URL from WebCore to WTF
[WebKit-https.git] / Source / WebKit / NetworkProcess / capture / NetworkCaptureManager.h
1 /*
2  * Copyright (C) 2016 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 #pragma once
27
28 #if ENABLE(NETWORK_CAPTURE)
29
30 #include <WebCore/FileHandle.h>
31 #include <WebCore/FileSystem.h>
32 #include <wtf/Function.h>
33 #include <wtf/URLParser.h>
34 #include <wtf/Vector.h>
35 #include <wtf/text/WTFString.h>
36
37 namespace WebCore {
38 class ResourceRequest;
39 }
40
41 namespace WebKit {
42 namespace NetworkCapture {
43
44 class Resource;
45
46 /*
47  * NetworkCapture::Manager serves three purposes:
48  *
49  *  * It keeps the state of whether we are recording, replaying, or neither.
50  *  * It keeps the list of cached resources (if replaying), performs fuzzy
51  *    matching on them.
52  *  * It has utilities for logging and file management.
53  *
54  * TODO: Perhaps we should break this up into three classes?
55  */
56 class Manager {
57     WTF_MAKE_NONCOPYABLE(Manager);
58     friend NeverDestroyed<Manager>;
59
60 public:
61     enum RecordReplayMode {
62         Disabled,
63         Record,
64         Replay
65     };
66
67     static Manager& singleton();
68
69     void initialize(const String& recordReplayMode, const String& recordReplayCacheLocation);
70     void terminate();
71
72     bool isRecording() const { return mode() == RecordReplayMode::Record; }
73     bool isReplaying() const { return mode() == RecordReplayMode::Replay; }
74     RecordReplayMode mode() const { return m_recordReplayMode; }
75
76     Resource* findMatch(const WebCore::ResourceRequest&);
77
78     void logRecordedResource(const WebCore::ResourceRequest&);
79     void logLoadedResource(Resource&);
80     void logPlayedBackResource(const WebCore::ResourceRequest&, bool wasCacheMiss);
81
82     WebCore::FileHandle openCacheFile(const String&, WebCore::FileSystem::FileOpenMode);
83
84     String requestToPath(const WebCore::ResourceRequest&);
85     static String urlIdentifyingCommonDomain(const URL&);
86
87 private:
88     Manager() = default;
89     ~Manager() = delete;
90
91     Resource* findExactMatch(const WebCore::ResourceRequest&);
92     Resource* findBestFuzzyMatch(const WebCore::ResourceRequest&);
93     int fuzzyMatchURLs(const URL& requestURL, const WTF::URLParser::URLEncodedForm& requestParameters, const URL& resourceURL, const WTF::URLParser::URLEncodedForm& resourceParameters);
94
95     void loadResources();
96
97     String reportLoadPath();
98     String reportRecordPath();
99     String reportReplayPath();
100
101     String stringToHash(const String&);
102     String hashToPath(const String& hash);
103
104     std::optional<Vector<Vector<String>>> readFile(const String& filePath);
105     bool getLine(uint8_t const *& p, uint8_t const * const end, Vector<String>& line);
106     bool getWord(uint8_t const *& p, uint8_t const * const end, String& word);
107
108     RecordReplayMode m_recordReplayMode { Disabled };
109     String m_recordReplayCacheLocation;
110
111     WebCore::FileHandle m_loadFileHandle;
112     WebCore::FileHandle m_recordFileHandle;
113     WebCore::FileHandle m_replayFileHandle;
114
115     Vector<Resource> m_cachedResources;
116 };
117
118 } // namespace NetworkCapture
119 } // namespace WebKit
120
121 #endif // ENABLE(NETWORK_CAPTURE)