mirror of
https://github.com/XRPLF/rippled.git
synced 2025-12-06 17:27:55 +00:00
98 lines
2.8 KiB
C++
98 lines
2.8 KiB
C++
//------------------------------------------------------------------------------
|
|
/*
|
|
Copyright (c) 2011-2013, OpenCoin, Inc.
|
|
*/
|
|
//==============================================================================
|
|
|
|
#ifndef RIPPLE_MULTISOCKET_H_INCLUDED
|
|
#define RIPPLE_MULTISOCKET_H_INCLUDED
|
|
|
|
/** A Socket that can handshake with multiple protocols.
|
|
*/
|
|
class MultiSocket : public Socket
|
|
{
|
|
public:
|
|
// immutable flags
|
|
struct Flag
|
|
{
|
|
enum Bit
|
|
{
|
|
peer = 0, // no handshaking. remaining flags ignored.
|
|
client_role = 1, // operate in client role
|
|
server_role = 2, // operate in server role
|
|
|
|
proxy = 4, // client: will send PROXY handshake
|
|
// server: PROXY handshake required
|
|
|
|
ssl = 8, // client: will use ssl
|
|
// server: will allow, but not require ssl
|
|
|
|
ssl_required = 16 // client: ignored
|
|
// server: will require ssl (ignores ssl flag)
|
|
};
|
|
|
|
Flag (int flags) noexcept
|
|
: m_flags (flags)
|
|
{
|
|
}
|
|
|
|
bool operator== (Flag const& other) const noexcept
|
|
{
|
|
return m_flags == other.m_flags;
|
|
}
|
|
|
|
inline bool set (int mask) const noexcept
|
|
{
|
|
return (m_flags & mask) == mask;
|
|
}
|
|
|
|
inline bool any_set (int mask) const noexcept
|
|
{
|
|
return (m_flags & mask) != 0;
|
|
}
|
|
|
|
Flag with (int mask) const noexcept
|
|
{
|
|
return Flag (m_flags | mask);
|
|
}
|
|
|
|
Flag without (int mask) const noexcept
|
|
{
|
|
return Flag (m_flags & ~mask);
|
|
}
|
|
|
|
private:
|
|
int m_flags;
|
|
};
|
|
|
|
enum Flags
|
|
{
|
|
none = 0,
|
|
client_ssl = 1,
|
|
server_ssl = 2,
|
|
server_ssl_required = 4,
|
|
server_proxy = 8
|
|
};
|
|
|
|
virtual SSL* native_handle () = 0;
|
|
|
|
/*
|
|
// This would be the underlying StreamSocket template parameter
|
|
typedef boost::asio::ip::tcp::socket NativeSocketType;
|
|
typedef boost::asio::ssl::stream <NativeSocketType&> SslStreamType;
|
|
virtual boost::asio::ip::tcp::socket& getNativeSocket () = 0;
|
|
virtual SslStreamType& getSslStream () = 0;
|
|
*/
|
|
|
|
static MultiSocket* New (boost::asio::io_service& io_service, int flags = 0);
|
|
static MultiSocket* New (boost::asio::ip::tcp::socket& socket, int flags = 0);
|
|
static MultiSocket* New (boost::asio::ssl::stream <boost::asio::ip::tcp::socket&>& stream, int flags = 0);
|
|
|
|
// Ripple uses a SSL/TLS context with specific parameters and this returns
|
|
// a reference to the corresponding boost::asio::ssl::context object.
|
|
//
|
|
static SslContextBase::BoostContextType& getRippleTlsBoostContext ();
|
|
};
|
|
|
|
#endif
|