Enable HTTP and HTTPS proxies on iOS and make it a property of the NSURLSession
[WebKit-https.git] / Source / WebKit / NetworkProcess / NetworkSessionCreationParameters.cpp
1 /*
2  * Copyright (C) 2018 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 "NetworkSessionCreationParameters.h"
28
29 #include "ArgumentCoders.h"
30
31 #if PLATFORM(COCOA)
32 #include "ArgumentCodersCF.h"
33 #endif
34
35 #if USE(CURL)
36 #include "WebCoreArgumentCoders.h"
37 #endif
38
39 namespace WebKit {
40
41 NetworkSessionCreationParameters NetworkSessionCreationParameters::privateSessionParameters(const PAL::SessionID& sessionID)
42 {
43     return { sessionID, { }, AllowsCellularAccess::Yes
44 #if PLATFORM(COCOA)
45         , { }, { }, { }, false, { }, { }, { }
46 #endif
47 #if USE(CURL)
48         , { }
49 #endif
50     };
51 }
52
53 void NetworkSessionCreationParameters::encode(IPC::Encoder& encoder) const
54 {
55     encoder << sessionID;
56     encoder << boundInterfaceIdentifier;
57     encoder << allowsCellularAccess;
58 #if PLATFORM(COCOA)
59     IPC::encode(encoder, proxyConfiguration.get());
60     encoder << sourceApplicationBundleIdentifier;
61     encoder << sourceApplicationSecondaryIdentifier;
62     encoder << shouldLogCookieInformation;
63     encoder << loadThrottleLatency;
64     encoder << httpProxy;
65     encoder << httpsProxy;
66 #endif
67 #if USE(CURL)
68     encoder << proxySettings;
69 #endif
70 }
71
72 std::optional<NetworkSessionCreationParameters> NetworkSessionCreationParameters::decode(IPC::Decoder& decoder)
73 {
74     PAL::SessionID sessionID;
75     if (!decoder.decode(sessionID))
76         return std::nullopt;
77     
78     std::optional<String> boundInterfaceIdentifier;
79     decoder >> boundInterfaceIdentifier;
80     if (!boundInterfaceIdentifier)
81         return std::nullopt;
82     
83     std::optional<AllowsCellularAccess> allowsCellularAccess;
84     decoder >> allowsCellularAccess;
85     if (!allowsCellularAccess)
86         return std::nullopt;
87     
88 #if PLATFORM(COCOA)
89     RetainPtr<CFDictionaryRef> proxyConfiguration;
90     if (!IPC::decode(decoder, proxyConfiguration))
91         return std::nullopt;
92     
93     std::optional<String> sourceApplicationBundleIdentifier;
94     decoder >> sourceApplicationBundleIdentifier;
95     if (!sourceApplicationBundleIdentifier)
96         return std::nullopt;
97     
98     std::optional<String> sourceApplicationSecondaryIdentifier;
99     decoder >> sourceApplicationSecondaryIdentifier;
100     if (!sourceApplicationSecondaryIdentifier)
101         return std::nullopt;
102     
103     std::optional<bool> shouldLogCookieInformation;
104     decoder >> shouldLogCookieInformation;
105     if (!shouldLogCookieInformation)
106         return std::nullopt;
107     
108     std::optional<Seconds> loadThrottleLatency;
109     decoder >> loadThrottleLatency;
110     if (!loadThrottleLatency)
111         return std::nullopt;
112     
113     std::optional<URL> httpProxy;
114     decoder >> httpProxy;
115     if (!httpProxy)
116         return std::nullopt;
117
118     std::optional<URL> httpsProxy;
119     decoder >> httpsProxy;
120     if (!httpsProxy)
121         return std::nullopt;
122 #endif
123     
124 #if USE(CURL)
125     std::optional<WebCore::CurlProxySettings> proxySettings;
126     decoder >> proxySettings;
127     if (!proxySettings)
128         return std::nullopt;
129 #endif
130     
131     return {{
132         sessionID
133         , WTFMove(*boundInterfaceIdentifier)
134         , WTFMove(*allowsCellularAccess)
135 #if PLATFORM(COCOA)
136         , WTFMove(proxyConfiguration)
137         , WTFMove(*sourceApplicationBundleIdentifier)
138         , WTFMove(*sourceApplicationSecondaryIdentifier)
139         , WTFMove(*shouldLogCookieInformation)
140         , WTFMove(*loadThrottleLatency)
141         , WTFMove(*httpProxy)
142         , WTFMove(*httpsProxy)
143 #endif
144 #if USE(CURL)
145         , WTFMove(*proxySettings)
146 #endif
147     }};
148 }
149
150 } // namespace WebKit