20 #ifndef RIPPLE_OVERLAY_PROTOCOLMESSAGE_H_INCLUDED
21 #define RIPPLE_OVERLAY_PROTOCOLMESSAGE_H_INCLUDED
23 #include <ripple/basics/ByteUtilities.h>
24 #include <ripple/overlay/Compression.h>
25 #include <ripple/overlay/Message.h>
26 #include <ripple/overlay/impl/ZeroCopyStream.h>
27 #include <ripple/protocol/messages.h>
28 #include <boost/asio/buffer.hpp>
29 #include <boost/asio/buffers_iterator.hpp>
30 #include <boost/system/error_code.hpp>
40 template <
class =
void>
46 case protocol::mtMANIFESTS:
48 case protocol::mtPING:
50 case protocol::mtCLUSTER:
52 case protocol::mtGET_SHARD_INFO:
53 return "get_shard_info";
54 case protocol::mtSHARD_INFO:
56 case protocol::mtGET_PEER_SHARD_INFO:
57 return "get_peer_shard_info";
58 case protocol::mtPEER_SHARD_INFO:
59 return "peer_shard_info";
60 case protocol::mtENDPOINTS:
62 case protocol::mtTRANSACTION:
64 case protocol::mtGET_LEDGER:
66 case protocol::mtLEDGER_DATA:
68 case protocol::mtPROPOSE_LEDGER:
70 case protocol::mtSTATUS_CHANGE:
72 case protocol::mtHAVE_SET:
74 case protocol::mtVALIDATORLIST:
75 return "validator_list";
76 case protocol::mtVALIDATION:
78 case protocol::mtGET_OBJECTS:
80 case protocol::mtSQUELCH:
117 template <
typename BufferSequence>
121 return boost::asio::buffers_iterator<BufferSequence, std::uint8_t>::begin(
132 template <
class BufferSequence>
133 boost::optional<MessageHeader>
135 boost::system::error_code& ec,
136 BufferSequence
const& bufs,
156 ec = make_error_code(boost::system::errc::success);
162 ec = make_error_code(boost::system::errc::protocol_error);
170 ec = make_error_code(boost::system::errc::protocol_error);
174 for (
int i = 0; i != 4; ++i)
182 for (
int i = 0; i != 2; ++i)
185 for (
int i = 0; i != 4; ++i)
194 if ((*iter & 0xFC) == 0)
200 ec = make_error_code(boost::system::errc::success);
206 for (
int i = 0; i != 4; ++i)
212 for (
int i = 0; i != 2; ++i)
218 ec = make_error_code(boost::system::errc::no_message);
231 auto const m = std::make_shared<T>();
248 if (payloadSize == 0 || !m->ParseFromArray(payload.
data(), payloadSize))
251 else if (!m->ParseFromZeroCopyStream(&stream))
255 handler.onMessage(m);
275 template <
class Buffers,
class Handler>
278 Buffers
const& buffers,
284 auto const size = boost::asio::buffer_size(buffers);
303 if (header->payload_wire_size >
megabytes(64) ||
304 header->uncompressed_size >
megabytes(64))
306 result.
second = make_error_code(boost::system::errc::message_size);
311 if (!handler.compressionEnabled() &&
314 result.
second = make_error_code(boost::system::errc::protocol_error);
320 if (header->total_wire_size > size)
322 hint = header->total_wire_size - size;
328 switch (header->message_type)
330 case protocol::mtMANIFESTS:
331 success = detail::invoke<protocol::TMManifests>(
332 *header, buffers, handler);
334 case protocol::mtPING:
336 detail::invoke<protocol::TMPing>(*header, buffers, handler);
338 case protocol::mtCLUSTER:
340 detail::invoke<protocol::TMCluster>(*header, buffers, handler);
342 case protocol::mtGET_SHARD_INFO:
343 success = detail::invoke<protocol::TMGetShardInfo>(
344 *header, buffers, handler);
346 case protocol::mtSHARD_INFO:
347 success = detail::invoke<protocol::TMShardInfo>(
348 *header, buffers, handler);
350 case protocol::mtGET_PEER_SHARD_INFO:
351 success = detail::invoke<protocol::TMGetPeerShardInfo>(
352 *header, buffers, handler);
354 case protocol::mtPEER_SHARD_INFO:
355 success = detail::invoke<protocol::TMPeerShardInfo>(
356 *header, buffers, handler);
358 case protocol::mtENDPOINTS:
359 success = detail::invoke<protocol::TMEndpoints>(
360 *header, buffers, handler);
362 case protocol::mtTRANSACTION:
363 success = detail::invoke<protocol::TMTransaction>(
364 *header, buffers, handler);
366 case protocol::mtGET_LEDGER:
367 success = detail::invoke<protocol::TMGetLedger>(
368 *header, buffers, handler);
370 case protocol::mtLEDGER_DATA:
371 success = detail::invoke<protocol::TMLedgerData>(
372 *header, buffers, handler);
374 case protocol::mtPROPOSE_LEDGER:
375 success = detail::invoke<protocol::TMProposeSet>(
376 *header, buffers, handler);
378 case protocol::mtSTATUS_CHANGE:
379 success = detail::invoke<protocol::TMStatusChange>(
380 *header, buffers, handler);
382 case protocol::mtHAVE_SET:
383 success = detail::invoke<protocol::TMHaveTransactionSet>(
384 *header, buffers, handler);
386 case protocol::mtVALIDATION:
387 success = detail::invoke<protocol::TMValidation>(
388 *header, buffers, handler);
390 case protocol::mtVALIDATORLIST:
391 success = detail::invoke<protocol::TMValidatorList>(
392 *header, buffers, handler);
394 case protocol::mtGET_OBJECTS:
395 success = detail::invoke<protocol::TMGetObjectByHash>(
396 *header, buffers, handler);
398 case protocol::mtSQUELCH:
400 detail::invoke<protocol::TMSquelch>(*header, buffers, handler);
403 handler.onMessageUnknown(header->message_type);
408 result.
first = header->total_wire_size;
411 result.
second = make_error_code(boost::system::errc::bad_message);