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,
152 ec = make_error_code(boost::system::errc::success);
158 ec = make_error_code(boost::system::errc::protocol_error);
166 ec = make_error_code(boost::system::errc::protocol_error);
170 for (
int i = 0; i != 4; ++i)
178 for (
int i = 0; i != 2; ++i)
181 for (
int i = 0; i != 4; ++i)
187 if ((*iter & 0xFC) == 0)
193 ec = make_error_code(boost::system::errc::success);
199 for (
int i = 0; i != 4; ++i)
205 for (
int i = 0; i != 2; ++i)
211 ec = make_error_code(boost::system::errc::no_message);
224 auto const m = std::make_shared<T>();
241 if (payloadSize == 0 || !m->ParseFromArray(payload.
data(), payloadSize))
244 else if (!m->ParseFromZeroCopyStream(&stream))
248 handler.onMessage(m);
268 template <
class Buffers,
class Handler>
271 Buffers
const& buffers,
277 auto const size = boost::asio::buffer_size(buffers);
296 if (header->payload_wire_size >
megabytes(64) ||
297 header->uncompressed_size >
megabytes(64))
299 result.
second = make_error_code(boost::system::errc::message_size);
304 if (!handler.compressionEnabled() &&
307 result.
second = make_error_code(boost::system::errc::protocol_error);
313 if (header->total_wire_size > size)
315 hint = header->total_wire_size - size;
321 switch (header->message_type)
323 case protocol::mtMANIFESTS:
324 success = detail::invoke<protocol::TMManifests>(
325 *header, buffers, handler);
327 case protocol::mtPING:
329 detail::invoke<protocol::TMPing>(*header, buffers, handler);
331 case protocol::mtCLUSTER:
333 detail::invoke<protocol::TMCluster>(*header, buffers, handler);
335 case protocol::mtGET_SHARD_INFO:
336 success = detail::invoke<protocol::TMGetShardInfo>(
337 *header, buffers, handler);
339 case protocol::mtSHARD_INFO:
340 success = detail::invoke<protocol::TMShardInfo>(
341 *header, buffers, handler);
343 case protocol::mtGET_PEER_SHARD_INFO:
344 success = detail::invoke<protocol::TMGetPeerShardInfo>(
345 *header, buffers, handler);
347 case protocol::mtPEER_SHARD_INFO:
348 success = detail::invoke<protocol::TMPeerShardInfo>(
349 *header, buffers, handler);
351 case protocol::mtENDPOINTS:
352 success = detail::invoke<protocol::TMEndpoints>(
353 *header, buffers, handler);
355 case protocol::mtTRANSACTION:
356 success = detail::invoke<protocol::TMTransaction>(
357 *header, buffers, handler);
359 case protocol::mtGET_LEDGER:
360 success = detail::invoke<protocol::TMGetLedger>(
361 *header, buffers, handler);
363 case protocol::mtLEDGER_DATA:
364 success = detail::invoke<protocol::TMLedgerData>(
365 *header, buffers, handler);
367 case protocol::mtPROPOSE_LEDGER:
368 success = detail::invoke<protocol::TMProposeSet>(
369 *header, buffers, handler);
371 case protocol::mtSTATUS_CHANGE:
372 success = detail::invoke<protocol::TMStatusChange>(
373 *header, buffers, handler);
375 case protocol::mtHAVE_SET:
376 success = detail::invoke<protocol::TMHaveTransactionSet>(
377 *header, buffers, handler);
379 case protocol::mtVALIDATION:
380 success = detail::invoke<protocol::TMValidation>(
381 *header, buffers, handler);
383 case protocol::mtVALIDATORLIST:
384 success = detail::invoke<protocol::TMValidatorList>(
385 *header, buffers, handler);
387 case protocol::mtGET_OBJECTS:
388 success = detail::invoke<protocol::TMGetObjectByHash>(
389 *header, buffers, handler);
391 case protocol::mtSQUELCH:
393 detail::invoke<protocol::TMSquelch>(*header, buffers, handler);
396 handler.onMessageUnknown(header->message_type);
401 result.
first = header->total_wire_size;
404 result.
second = make_error_code(boost::system::errc::bad_message);