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:
115 template <
typename BufferSequence>
119 return boost::asio::buffers_iterator<BufferSequence, std::uint8_t>::begin(
130 template <
class BufferSequence>
131 boost::optional<MessageHeader>
133 boost::system::error_code& ec,
134 BufferSequence
const& bufs,
150 ec = make_error_code(boost::system::errc::success);
156 ec = make_error_code(boost::system::errc::protocol_error);
164 ec = make_error_code(boost::system::errc::protocol_error);
168 for (
int i = 0; i != 4; ++i)
176 for (
int i = 0; i != 2; ++i)
179 for (
int i = 0; i != 4; ++i)
185 if ((*iter & 0xFC) == 0)
191 ec = make_error_code(boost::system::errc::success);
197 for (
int i = 0; i != 4; ++i)
203 for (
int i = 0; i != 2; ++i)
209 ec = make_error_code(boost::system::errc::no_message);
222 auto const m = std::make_shared<T>();
239 if (payloadSize == 0 || !m->ParseFromArray(payload.
data(), payloadSize))
242 else if (!m->ParseFromZeroCopyStream(&stream))
246 handler.onMessage(m);
261 template <
class Buffers,
class Handler>
267 auto const size = boost::asio::buffer_size(buffers);
286 if (header->payload_wire_size >
megabytes(64) ||
287 header->uncompressed_size >
megabytes(64))
289 result.
second = make_error_code(boost::system::errc::message_size);
294 if (!handler.compressionEnabled() &&
297 result.
second = make_error_code(boost::system::errc::protocol_error);
303 if (header->total_wire_size > size)
308 switch (header->message_type)
310 case protocol::mtMANIFESTS:
311 success = detail::invoke<protocol::TMManifests>(
312 *header, buffers, handler);
314 case protocol::mtPING:
316 detail::invoke<protocol::TMPing>(*header, buffers, handler);
318 case protocol::mtCLUSTER:
320 detail::invoke<protocol::TMCluster>(*header, buffers, handler);
322 case protocol::mtGET_SHARD_INFO:
323 success = detail::invoke<protocol::TMGetShardInfo>(
324 *header, buffers, handler);
326 case protocol::mtSHARD_INFO:
327 success = detail::invoke<protocol::TMShardInfo>(
328 *header, buffers, handler);
330 case protocol::mtGET_PEER_SHARD_INFO:
331 success = detail::invoke<protocol::TMGetPeerShardInfo>(
332 *header, buffers, handler);
334 case protocol::mtPEER_SHARD_INFO:
335 success = detail::invoke<protocol::TMPeerShardInfo>(
336 *header, buffers, handler);
338 case protocol::mtENDPOINTS:
339 success = detail::invoke<protocol::TMEndpoints>(
340 *header, buffers, handler);
342 case protocol::mtTRANSACTION:
343 success = detail::invoke<protocol::TMTransaction>(
344 *header, buffers, handler);
346 case protocol::mtGET_LEDGER:
347 success = detail::invoke<protocol::TMGetLedger>(
348 *header, buffers, handler);
350 case protocol::mtLEDGER_DATA:
351 success = detail::invoke<protocol::TMLedgerData>(
352 *header, buffers, handler);
354 case protocol::mtPROPOSE_LEDGER:
355 success = detail::invoke<protocol::TMProposeSet>(
356 *header, buffers, handler);
358 case protocol::mtSTATUS_CHANGE:
359 success = detail::invoke<protocol::TMStatusChange>(
360 *header, buffers, handler);
362 case protocol::mtHAVE_SET:
363 success = detail::invoke<protocol::TMHaveTransactionSet>(
364 *header, buffers, handler);
366 case protocol::mtVALIDATION:
367 success = detail::invoke<protocol::TMValidation>(
368 *header, buffers, handler);
370 case protocol::mtVALIDATORLIST:
371 success = detail::invoke<protocol::TMValidatorList>(
372 *header, buffers, handler);
374 case protocol::mtGET_OBJECTS:
375 success = detail::invoke<protocol::TMGetObjectByHash>(
376 *header, buffers, handler);
379 handler.onMessageUnknown(header->message_type);
384 result.
first = header->total_wire_size;
387 result.
second = make_error_code(boost::system::errc::bad_message);