Expose WebPageProxy identifier to the Network Process
[WebKit-https.git] / Source / WebCore / platform / network / soup / ResourceRequest.h
1 /*
2  * Copyright (C) 2003, 2006 Apple Inc.  All rights reserved.
3  * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #ifndef ResourceRequest_h
28 #define ResourceRequest_h
29
30 #include "PageIdentifier.h"
31 #include "ResourceRequestBase.h"
32 #include "URLSoup.h"
33
34 namespace WebCore {
35
36     class BlobRegistryImpl;
37
38     class ResourceRequest : public ResourceRequestBase {
39     public:
40         ResourceRequest(const String& url)
41             : ResourceRequestBase(URL({ }, url), ResourceRequestCachePolicy::UseProtocolCachePolicy)
42             , m_acceptEncoding(true)
43             , m_soupFlags(static_cast<SoupMessageFlags>(0))
44         {
45         }
46
47         ResourceRequest(const URL& url)
48             : ResourceRequestBase(url, ResourceRequestCachePolicy::UseProtocolCachePolicy)
49             , m_acceptEncoding(true)
50             , m_soupFlags(static_cast<SoupMessageFlags>(0))
51         {
52         }
53
54         ResourceRequest(const URL& url, const String& referrer, ResourceRequestCachePolicy policy = ResourceRequestCachePolicy::UseProtocolCachePolicy)
55             : ResourceRequestBase(url, policy)
56             , m_acceptEncoding(true)
57             , m_soupFlags(static_cast<SoupMessageFlags>(0))
58         {
59             setHTTPReferrer(referrer);
60         }
61
62         ResourceRequest()
63             : ResourceRequestBase(URL(), ResourceRequestCachePolicy::UseProtocolCachePolicy)
64             , m_acceptEncoding(true)
65             , m_soupFlags(static_cast<SoupMessageFlags>(0))
66         {
67         }
68
69         ResourceRequest(SoupMessage* soupMessage)
70             : ResourceRequestBase(URL(), ResourceRequestCachePolicy::UseProtocolCachePolicy)
71             , m_acceptEncoding(true)
72             , m_soupFlags(static_cast<SoupMessageFlags>(0))
73         {
74             updateFromSoupMessage(soupMessage);
75         }
76
77         ResourceRequest(SoupRequest* soupRequest)
78             : ResourceRequestBase(soupURIToURL(soup_request_get_uri(soupRequest)), ResourceRequestCachePolicy::UseProtocolCachePolicy)
79             , m_acceptEncoding(true)
80             , m_soupFlags(static_cast<SoupMessageFlags>(0))
81         {
82             updateFromSoupRequest(soupRequest);
83         }
84
85         void updateFromDelegatePreservingOldProperties(const ResourceRequest& delegateProvidedRequest) { *this = delegateProvidedRequest; }
86
87         bool acceptEncoding() const { return m_acceptEncoding; }
88         void setAcceptEncoding(bool acceptEncoding) { m_acceptEncoding = acceptEncoding; }
89
90         void updateSoupMessageHeaders(SoupMessageHeaders*) const;
91         void updateFromSoupMessageHeaders(SoupMessageHeaders*);
92         void updateSoupMessage(SoupMessage*, BlobRegistryImpl&) const;
93         void updateFromSoupMessage(SoupMessage*);
94         void updateSoupRequest(SoupRequest*) const;
95         void updateFromSoupRequest(SoupRequest*);
96
97         SoupMessageFlags soupMessageFlags() const { return m_soupFlags; }
98         void setSoupMessageFlags(SoupMessageFlags soupFlags) { m_soupFlags = soupFlags; }
99
100         // WebPageProxyIdentifier.
101         Optional<uint64_t> initiatingPageID() const { return m_initiatingPageID; }
102         void setInitiatingPageID(uint64_t pageID) { m_initiatingPageID = pageID; }
103
104         GUniquePtr<SoupURI> createSoupURI() const;
105
106         template<class Encoder> void encodeWithPlatformData(Encoder&) const;
107         template<class Decoder> bool decodeWithPlatformData(Decoder&);
108
109     private:
110         friend class ResourceRequestBase;
111
112         bool m_acceptEncoding : 1;
113         SoupMessageFlags m_soupFlags;
114         Optional<uint64_t> m_initiatingPageID;
115
116         void updateSoupMessageMembers(SoupMessage*) const;
117         void updateSoupMessageBody(SoupMessage*, BlobRegistryImpl&) const;
118         void doUpdatePlatformRequest() { }
119         void doUpdateResourceRequest() { }
120         void doUpdatePlatformHTTPBody() { }
121         void doUpdateResourceHTTPBody() { }
122
123         void doPlatformSetAsIsolatedCopy(const ResourceRequest&) { }
124     };
125
126 template<class Encoder>
127 void ResourceRequest::encodeWithPlatformData(Encoder& encoder) const
128 {
129     encodeBase(encoder);
130
131     // FIXME: Do not encode HTTP message body.
132     // 1. It can be large and thus costly to send across.
133     // 2. It is misleading to provide a body with some requests, while others use body streams, which cannot be serialized at all.
134     encoder << static_cast<bool>(m_httpBody);
135     if (m_httpBody)
136         encoder << m_httpBody->flattenToString();
137
138     encoder << static_cast<uint32_t>(m_soupFlags);
139     encoder << m_initiatingPageID;
140 }
141
142 template<class Decoder>
143 bool ResourceRequest::decodeWithPlatformData(Decoder& decoder)
144 {
145     if (!decodeBase(decoder))
146         return false;
147
148     bool hasHTTPBody;
149     if (!decoder.decode(hasHTTPBody))
150         return false;
151     if (hasHTTPBody) {
152         String httpBody;
153         if (!decoder.decode(httpBody))
154             return false;
155         setHTTPBody(FormData::create(httpBody.utf8()));
156     }
157
158     uint32_t soupMessageFlags;
159     if (!decoder.decode(soupMessageFlags))
160         return false;
161     m_soupFlags = static_cast<SoupMessageFlags>(soupMessageFlags);
162
163     Optional<Optional<uint64_t>> initiatingPageID;
164     decoder >> initiatingPageID;
165     if (!initiatingPageID)
166         return false;
167     m_initiatingPageID = *initiatingPageID;
168
169     return true;
170 }
171
172 inline SoupMessagePriority toSoupMessagePriority(ResourceLoadPriority priority)
173 {
174     switch (priority) {
175     case ResourceLoadPriority::VeryLow:
176         return SOUP_MESSAGE_PRIORITY_VERY_LOW;
177     case ResourceLoadPriority::Low:
178         return SOUP_MESSAGE_PRIORITY_LOW;
179     case ResourceLoadPriority::Medium:
180         return SOUP_MESSAGE_PRIORITY_NORMAL;
181     case ResourceLoadPriority::High:
182         return SOUP_MESSAGE_PRIORITY_HIGH;
183     case ResourceLoadPriority::VeryHigh:
184         return SOUP_MESSAGE_PRIORITY_VERY_HIGH;
185     }
186
187     ASSERT_NOT_REACHED();
188     return SOUP_MESSAGE_PRIORITY_VERY_LOW;
189 }
190
191 } // namespace WebCore
192
193 #endif // ResourceRequest_h