Move URL from WebCore to WTF
[WebKit-https.git] / Source / WebKit / NetworkProcess / NetworkSocketStream.cpp
1 /*
2  * Copyright (C) 2017-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 "NetworkSocketStream.h"
28
29 #include "DataReference.h"
30 #include "WebSocketStreamMessages.h"
31 #include <WebCore/CookieRequestHeaderFieldProxy.h>
32 #include <WebCore/SocketStreamError.h>
33 #include <WebCore/SocketStreamHandleImpl.h>
34
35 namespace WebKit {
36 using namespace WebCore;
37
38 Ref<NetworkSocketStream> NetworkSocketStream::create(URL&& url, PAL::SessionID sessionID, const String& credentialPartition, uint64_t identifier, IPC::Connection& connection, SourceApplicationAuditToken&& auditData)
39 {
40     return adoptRef(*new NetworkSocketStream(WTFMove(url), sessionID, credentialPartition, identifier, connection, WTFMove(auditData)));
41 }
42
43 NetworkSocketStream::NetworkSocketStream(URL&& url, PAL::SessionID sessionID, const String& credentialPartition, uint64_t identifier, IPC::Connection& connection, SourceApplicationAuditToken&& auditData)
44     : m_identifier(identifier)
45     , m_connection(connection)
46     , m_impl(SocketStreamHandleImpl::create(url, *this, sessionID, credentialPartition, WTFMove(auditData)))
47 {
48 }
49
50 void NetworkSocketStream::sendData(const IPC::DataReference& data, uint64_t identifier)
51 {
52     m_impl->platformSend(data.data(), data.size(), [this, protectedThis = makeRef(*this), identifier] (bool success) {
53         send(Messages::WebSocketStream::DidSendData(identifier, success));
54     });
55 }
56
57 void NetworkSocketStream::sendHandshake(const IPC::DataReference& data, const std::optional<CookieRequestHeaderFieldProxy>& headerFieldProxy, uint64_t identifier)
58 {
59     m_impl->platformSendHandshake(data.data(), data.size(), headerFieldProxy, [this, protectedThis = makeRef(*this), identifier] (bool success, bool didAccessSecureCookies) {
60         send(Messages::WebSocketStream::DidSendHandshake(identifier, success, didAccessSecureCookies));
61     });
62 }
63
64 void NetworkSocketStream::close()
65 {
66     m_impl->platformClose();
67 }
68
69 NetworkSocketStream::~NetworkSocketStream()
70 {
71     close();
72 }
73
74 void NetworkSocketStream::didOpenSocketStream(SocketStreamHandle& handle)
75 {
76     ASSERT_UNUSED(handle, &handle == m_impl.ptr());
77     send(Messages::WebSocketStream::DidOpenSocketStream());
78 }
79
80 void NetworkSocketStream::didCloseSocketStream(SocketStreamHandle& handle)
81 {
82     ASSERT_UNUSED(handle, &handle == m_impl.ptr());
83     send(Messages::WebSocketStream::DidCloseSocketStream());
84 }
85
86 void NetworkSocketStream::didReceiveSocketStreamData(SocketStreamHandle& handle, const char* data, size_t length)
87 {
88     ASSERT_UNUSED(handle, &handle == m_impl.ptr());
89     send(Messages::WebSocketStream::DidReceiveSocketStreamData(IPC::DataReference(reinterpret_cast<const uint8_t*>(data), length)));
90 }
91
92 void NetworkSocketStream::didFailToReceiveSocketStreamData(WebCore::SocketStreamHandle& handle)
93 {
94     ASSERT_UNUSED(handle, &handle == m_impl.ptr());
95     send(Messages::WebSocketStream::DidFailToReceiveSocketStreamData());
96 }
97
98 void NetworkSocketStream::didUpdateBufferedAmount(SocketStreamHandle& handle, size_t amount)
99 {
100     ASSERT_UNUSED(handle, &handle == m_impl.ptr());
101     send(Messages::WebSocketStream::DidUpdateBufferedAmount(amount));
102 }
103
104 void NetworkSocketStream::didFailSocketStream(SocketStreamHandle& handle, const SocketStreamError& error)
105 {
106     ASSERT_UNUSED(handle, &handle == m_impl.ptr());
107     send(Messages::WebSocketStream::DidFailSocketStream(error));
108 }
109
110 IPC::Connection* NetworkSocketStream::messageSenderConnection()
111 {
112     return &m_connection;
113 }
114
115 uint64_t NetworkSocketStream::messageSenderDestinationID()
116 {
117     return m_identifier;
118 }
119
120 } // namespace WebKit