Move URL from WebCore to WTF
[WebKit-https.git] / Source / WebKit / NetworkProcess / capture / NetworkCaptureResource.cpp
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 #include "config.h"
27 #include "NetworkCaptureResource.h"
28
29 #if ENABLE(NETWORK_CAPTURE)
30
31 #include "NetworkCaptureEvent.h"
32 #include "NetworkCaptureLogging.h"
33 #include "NetworkCaptureManager.h"
34 #include "NetworkCaptureRecorder.h"
35
36 namespace WebKit {
37 namespace NetworkCapture {
38
39 Resource::Resource(const String& eventFilePath)
40     : m_eventFilePath(eventFilePath)
41 {
42 }
43
44 const URL& Resource::url()
45 {
46     if (!m_url.isValid()) {
47         auto events = eventStream();
48         auto event = events.nextEvent();
49         if (!event)
50             DEBUG_LOG_ERROR("Event stream does not contain events: file = " STRING_SPECIFIER, DEBUG_STR(m_eventFilePath));
51         else if (!WTF::holds_alternative<RequestSentEvent>(*event))
52             DEBUG_LOG_ERROR("Event stream does not have a requestSent event: file = " STRING_SPECIFIER, DEBUG_STR(m_eventFilePath));
53         else {
54             auto requestSentEvent = WTF::get<RequestSentEvent>(*event);
55             m_url = URL({ }, requestSentEvent.request.url);
56         }
57     }
58
59     return m_url;
60 }
61
62 const String& Resource::urlIdentifyingCommonDomain()
63 {
64     if (m_urlIdentifyingCommonDomain.isNull())
65         m_urlIdentifyingCommonDomain = Manager::urlIdentifyingCommonDomain(url());
66
67     return m_urlIdentifyingCommonDomain;
68 }
69
70 WTF::URLParser::URLEncodedForm Resource::queryParameters()
71 {
72     if (!m_queryParameters)
73         m_queryParameters = WTF::URLParser::parseURLEncodedForm(url().query());
74
75     return *m_queryParameters;
76 }
77
78 Resource::EventStream Resource::eventStream()
79 {
80     return EventStream(m_eventFilePath);
81 }
82
83 Resource::EventStream::EventStream(const String& eventFilePath)
84     : m_eventFilePath(eventFilePath)
85     , m_mappedEventFile(m_eventFilePath, m_haveMappedEventFile)
86 {
87 }
88
89 OptionalCaptureEvent Resource::EventStream::nextEvent()
90 {
91     if (m_offset == m_mappedEventFile.size()) {
92         DEBUG_LOG_ERROR("Unable to return event - at end of file: " STRING_SPECIFIER, DEBUG_STR(m_eventFilePath));
93         return std::nullopt;
94     }
95
96     const char* charBuffer = static_cast<const char*>(m_mappedEventFile.data());
97     const char* current = charBuffer + m_offset;
98
99     while (m_offset < m_mappedEventFile.size() && charBuffer[m_offset])
100         ++m_offset;
101
102     if (m_offset == m_mappedEventFile.size()) {
103         DEBUG_LOG_ERROR("Unable to return event - no terminating NUL: " STRING_SPECIFIER, DEBUG_STR(m_eventFilePath));
104         return std::nullopt;
105     }
106
107     ++m_offset;
108
109     return stringToEvent(current);
110 }
111
112 } // namespace NetworkCapture
113 } // namespace WebKit
114
115 #endif // ENABLE(NETWORK_CAPTURE)