rippled
Loading...
Searching...
No Matches
WSSession.h
1#ifndef XRPL_SERVER_WSSESSION_H_INCLUDED
2#define XRPL_SERVER_WSSESSION_H_INCLUDED
3
4#include <xrpl/server/Handoff.h>
5#include <xrpl/server/Port.h>
6#include <xrpl/server/Writer.h>
7
8#include <boost/asio/buffer.hpp>
9#include <boost/asio/ip/tcp.hpp>
10#include <boost/beast/core/buffers_prefix.hpp>
11#include <boost/beast/websocket/rfc6455.hpp>
12#include <boost/logic/tribool.hpp>
13
14#include <algorithm>
15#include <functional>
16#include <memory>
17#include <utility>
18#include <vector>
19
20namespace ripple {
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
49 prepare(std::size_t bytes, std::function<void(void)> resume) = 0;
50};
51
52template <class Streambuf>
53class StreambufWSMsg : public WSMsg
54{
55 Streambuf sb_;
57
58public:
59 StreambufWSMsg(Streambuf&& sb) : sb_(std::move(sb))
60 {
61 }
62
64 prepare(std::size_t bytes, std::function<void(void)>) override
65 {
66 if (sb_.size() == 0)
67 return {true, {}};
68 sb_.consume(n_);
69 boost::tribool done;
70 if (bytes < sb_.size())
71 {
72 n_ = bytes;
73 done = false;
74 }
75 else
76 {
77 n_ = sb_.size();
78 done = true;
79 }
80 auto const pb = boost::beast::buffers_prefix(n_, sb_.data());
82 std::distance(pb.begin(), pb.end()));
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 virtual Port const&
102 port() const = 0;
103
104 virtual http_request_type const&
105 request() const = 0;
106
107 virtual boost::asio::ip::tcp::endpoint const&
108 remote_endpoint() const = 0;
109
111 virtual void
113
114 virtual void
115 close() = 0;
116
117 virtual void
118 close(boost::beast::websocket::close_reason const& reason) = 0;
119
124 virtual void
125 complete() = 0;
126};
127
128} // namespace ripple
129
130#endif
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:64
StreambufWSMsg(Streambuf &&sb)
Definition WSSession.h:59
WSMsg & operator=(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(WSMsg const &)=delete
WSMsg()=default
T copy(T... args)
T distance(T... args)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:6
boost::beast::http::request< boost::beast::http::dynamic_body > http_request_type
Definition Handoff.h:14
STL namespace.
Configuration information for a Server listening port.
Definition Port.h:31
virtual void close()=0
std::shared_ptr< void > appDefined
Definition WSSession.h:90
virtual http_request_type const & request() const =0
virtual boost::asio::ip::tcp::endpoint const & remote_endpoint() const =0
WSSession & operator=(WSSession const &)=delete
virtual Port const & port() const =0
virtual void run()=0
virtual void send(std::shared_ptr< WSMsg > w)=0
Send a WebSockets message.
WSSession()=default
virtual void close(boost::beast::websocket::close_reason const &reason)=0
WSSession(WSSession const &)=delete
virtual void complete()=0
Indicate that the response is complete.
virtual ~WSSession()=default