rippled
Loading...
Searching...
No Matches
WSSession.h
1#pragma once
2
3#include <xrpl/server/Handoff.h>
4#include <xrpl/server/Port.h>
5#include <xrpl/server/Writer.h>
6
7#include <boost/asio/buffer.hpp>
8#include <boost/asio/ip/tcp.hpp>
9#include <boost/beast/core/buffers_prefix.hpp>
10#include <boost/beast/websocket/rfc6455.hpp>
11#include <boost/logic/tribool.hpp>
12
13#include <algorithm>
14#include <functional>
15#include <memory>
16#include <utility>
17#include <vector>
18
19namespace xrpl {
20
21class WSMsg
22{
23public:
24 WSMsg() = default;
25 WSMsg(WSMsg const&) = delete;
26 WSMsg&
27 operator=(WSMsg const&) = delete;
28 virtual ~WSMsg() = default;
29
48 prepare(std::size_t bytes, std::function<void(void)> resume) = 0;
49};
50
51template <class Streambuf>
52class StreambufWSMsg : public WSMsg
53{
54 Streambuf sb_;
56
57public:
58 StreambufWSMsg(Streambuf&& sb) : sb_(std::move(sb))
59 {
60 }
61
63 prepare(std::size_t bytes, std::function<void(void)>) override
64 {
65 if (sb_.size() == 0)
66 return {true, {}};
67 sb_.consume(n_);
68 boost::tribool done;
69 if (bytes < sb_.size())
70 {
71 n_ = bytes;
72 done = false;
73 }
74 else
75 {
76 n_ = sb_.size();
77 done = true;
78 }
79 auto const pb = boost::beast::buffers_prefix(n_, sb_.data());
81 std::copy(pb.begin(), pb.end(), std::back_inserter(vb));
82 return {done, vb};
83 }
84};
85
87{
89
90 virtual ~WSSession() = default;
91 WSSession() = default;
92 WSSession(WSSession const&) = delete;
94 operator=(WSSession const&) = delete;
95
96 virtual void
97 run() = 0;
98
99 virtual Port const&
100 port() const = 0;
101
102 virtual http_request_type const&
103 request() const = 0;
104
105 virtual boost::asio::ip::tcp::endpoint const&
106 remote_endpoint() const = 0;
107
109 virtual void
111
112 virtual void
113 close() = 0;
114
115 virtual void
116 close(boost::beast::websocket::close_reason const& reason) = 0;
117
122 virtual void
123 complete() = 0;
124};
125
126} // 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:63
StreambufWSMsg(Streambuf &&sb)
Definition WSSession.h:58
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 > http_request_type
Definition Handoff.h:12
Configuration information for a Server listening port.
Definition Port.h:30
virtual ~WSSession()=default
virtual void close(boost::beast::websocket::close_reason const &reason)=0
virtual boost::asio::ip::tcp::endpoint const & remote_endpoint() const =0
virtual http_request_type const & request() const =0
virtual void run()=0
WSSession(WSSession const &)=delete
std::shared_ptr< void > appDefined
Definition WSSession.h:88
virtual Port const & port() const =0
WSSession()=default
virtual void complete()=0
Indicate that the response is complete.
WSSession & operator=(WSSession const &)=delete
virtual void close()=0
virtual void send(std::shared_ptr< WSMsg > w)=0
Send a WebSockets message.