1/*
2 * Copyright (C) 2009 Apple Inc. All rights reserved.
3 * Copyright (C) 2009, 2012 Google Inc. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met:
8 *
9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above
12 * copyright notice, this list of conditions and the following disclaimer
13 * in the documentation and/or other materials provided with the
14 * distribution.
15 * * Neither the name of Google Inc. nor the names of its
16 * contributors may be used to endorse or promote products derived from
17 * this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32#pragma once
33
34#include <wtf/ThreadSafeRefCounted.h>
35#include <wtf/URL.h>
36
37namespace WebCore {
38
39struct CookieRequestHeaderFieldProxy;
40class SocketStreamHandleClient;
41
42typedef struct {
43#if PLATFORM(COCOA)
44 RetainPtr<CFDataRef> sourceApplicationAuditData;
45#else
46 void *empty { nullptr };
47#endif
48} SourceApplicationAuditToken;
49
50class SocketStreamHandle : public ThreadSafeRefCounted<SocketStreamHandle, WTF::DestructionThread::Main> {
51public:
52 enum SocketStreamState { Connecting, Open, Closing, Closed };
53 virtual ~SocketStreamHandle() = default;
54 SocketStreamState state() const;
55
56 void sendData(const char* data, size_t length, Function<void(bool)>);
57 void sendHandshake(CString&& handshake, Optional<CookieRequestHeaderFieldProxy>&&, Function<void(bool, bool)>);
58 void close(); // Disconnect after all data in buffer are sent.
59 void disconnect();
60 virtual size_t bufferedAmount() = 0;
61
62protected:
63 WEBCORE_EXPORT SocketStreamHandle(const URL&, SocketStreamHandleClient&);
64
65 virtual void platformSend(const uint8_t* data, size_t length, Function<void(bool)>&&) = 0;
66 virtual void platformSendHandshake(const uint8_t* data, size_t length, const Optional<CookieRequestHeaderFieldProxy>&, Function<void(bool, bool)>&&) = 0;
67 virtual void platformClose() = 0;
68
69 URL m_url;
70 SocketStreamHandleClient& m_client;
71 SocketStreamState m_state;
72};
73
74} // namespace WebCore
75