xrpld
Loading...
Searching...
No Matches
WSSession.h
1#pragma once
2
3#include <xrpl/server/Handoff.h>
4#include <xrpl/server/Port.h>
5
6#include <boost/asio/buffer.hpp>
7#include <boost/asio/ip/tcp.hpp>
8#include <boost/beast/core/buffers_prefix.hpp>
9#include <boost/beast/websocket/rfc6455.hpp>
10#include <boost/logic/tribool.hpp>
11
12#include <algorithm>
13#include <cstddef>
14#include <functional>
15#include <iterator>
16#include <memory>
17#include <utility>
18#include <vector>
19
20namespace xrpl {
21
22class WSMsg
23{
24public:
25 WSMsg() = default;
26 WSMsg(WSMsg const&) = delete;
27 WSMsg&
28 operator=(WSMsg const&) = delete;
29 virtual ~WSMsg() = default;
30
50 prepare(std::size_t bytes, std::function<void(void)> resume) = 0;
51};
52
53template <class Streambuf>
54class StreambufWSMsg : public WSMsg
55{
56 Streambuf sb_;
58
59public:
60 StreambufWSMsg(Streambuf&& sb) : sb_(std::move(sb))
61 {
62 }
63
65 prepare(std::size_t bytes, std::function<void(void)>) override
66 {
67 if (sb_.size() == 0)
68 return {true, {}};
69 sb_.consume(n_);
70 boost::tribool done;
71 if (bytes < sb_.size())
72 {
73 n_ = bytes;
74 done = false;
75 }
76 else
77 {
78 n_ = sb_.size();
79 done = true;
80 }
81 auto const pb = boost::beast::buffers_prefix(n_, sb_.data());
83 std::copy(pb.begin(), pb.end(), std::back_inserter(vb));
84 return {done, vb};
85 }
86};
87
89{
91
92 virtual ~WSSession() = default;
93 WSSession() = default;
94 WSSession(WSSession const&) = delete;
96 operator=(WSSession const&) = delete;
97
98 virtual void
99 run() = 0;
100
101 [[nodiscard]] virtual Port const&
102 port() const = 0;
103
104 [[nodiscard]] virtual HttpRequestType const&
105 request() const = 0;
106
107 [[nodiscard]] virtual boost::asio::ip::tcp::endpoint const&
108 remoteEndpoint() const = 0;
109
113 virtual void
115
116 virtual void
117 close() = 0;
118
119 virtual void
120 close(boost::beast::websocket::close_reason const& reason) = 0;
121
127 virtual void
128 complete() = 0;
129};
130
131} // namespace xrpl
T back_inserter(T... args)
std::pair< boost::tribool, std::vector< boost::asio::const_buffer > > prepare(std::size_t bytes, std::function< void(void)>) override
Retrieve message data.
Definition WSSession.h:65
StreambufWSMsg(Streambuf &&sb)
Definition WSSession.h:60
WSMsg & operator=(WSMsg const &)=delete
WSMsg(WSMsg const &)=delete
virtual ~WSMsg()=default
virtual std::pair< boost::tribool, std::vector< boost::asio::const_buffer > > prepare(std::size_t bytes, std::function< void(void)> resume)=0
Retrieve message data.
WSMsg()=default
T copy(T... args)
T distance(T... args)
STL namespace.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
boost::beast::http::request< boost::beast::http::dynamic_body > HttpRequestType
Definition Handoff.h:12
Configuration information for a Server listening port.
Definition Port.h:29
virtual ~WSSession()=default
virtual void close(boost::beast::websocket::close_reason const &reason)=0
virtual void run()=0
virtual boost::asio::ip::tcp::endpoint const & remoteEndpoint() const =0
WSSession(WSSession const &)=delete
std::shared_ptr< void > appDefined
Definition WSSession.h:90
virtual Port const & port() const =0
WSSession()=default
virtual void complete()=0
Indicate that the response is complete.
virtual HttpRequestType const & request() const =0
WSSession & operator=(WSSession const &)=delete
virtual void close()=0
virtual void send(std::shared_ptr< WSMsg > w)=0
Send a WebSockets message.