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);
263 template <
class Buffers,
class Handler>
269 auto const size = boost::asio::buffer_size(buffers);
288 if (header->payload_wire_size >
megabytes(64) ||
289 header->uncompressed_size >
megabytes(64))
291 result.
second = make_error_code(boost::system::errc::message_size);
296 if (!handler.compressionEnabled() &&
299 result.
second = make_error_code(boost::system::errc::protocol_error);
305 if (header->total_wire_size > size)
310 switch (header->message_type)
312 case protocol::mtMANIFESTS:
313 success = detail::invoke<protocol::TMManifests>(
314 *header, buffers, handler);
316 case protocol::mtPING:
318 detail::invoke<protocol::TMPing>(*header, buffers, handler);
320 case protocol::mtCLUSTER:
322 detail::invoke<protocol::TMCluster>(*header, buffers, handler);
324 case protocol::mtGET_SHARD_INFO:
325 success = detail::invoke<protocol::TMGetShardInfo>(
326 *header, buffers, handler);
328 case protocol::mtSHARD_INFO:
329 success = detail::invoke<protocol::TMShardInfo>(
330 *header, buffers, handler);
332 case protocol::mtGET_PEER_SHARD_INFO:
333 success = detail::invoke<protocol::TMGetPeerShardInfo>(
334 *header, buffers, handler);
336 case protocol::mtPEER_SHARD_INFO:
337 success = detail::invoke<protocol::TMPeerShardInfo>(
338 *header, buffers, handler);
340 case protocol::mtENDPOINTS:
341 success = detail::invoke<protocol::TMEndpoints>(
342 *header, buffers, handler);
344 case protocol::mtTRANSACTION:
345 success = detail::invoke<protocol::TMTransaction>(
346 *header, buffers, handler);
348 case protocol::mtGET_LEDGER:
349 success = detail::invoke<protocol::TMGetLedger>(
350 *header, buffers, handler);
352 case protocol::mtLEDGER_DATA:
353 success = detail::invoke<protocol::TMLedgerData>(
354 *header, buffers, handler);
356 case protocol::mtPROPOSE_LEDGER:
357 success = detail::invoke<protocol::TMProposeSet>(
358 *header, buffers, handler);
360 case protocol::mtSTATUS_CHANGE:
361 success = detail::invoke<protocol::TMStatusChange>(
362 *header, buffers, handler);
364 case protocol::mtHAVE_SET:
365 success = detail::invoke<protocol::TMHaveTransactionSet>(
366 *header, buffers, handler);
368 case protocol::mtVALIDATION:
369 success = detail::invoke<protocol::TMValidation>(
370 *header, buffers, handler);
372 case protocol::mtVALIDATORLIST:
373 success = detail::invoke<protocol::TMValidatorList>(
374 *header, buffers, handler);
376 case protocol::mtGET_OBJECTS:
377 success = detail::invoke<protocol::TMGetObjectByHash>(
378 *header, buffers, handler);
380 case protocol::mtSQUELCH:
382 detail::invoke<protocol::TMSquelch>(*header, buffers, handler);
385 handler.onMessageUnknown(header->message_type);
390 result.
first = header->total_wire_size;
393 result.
second = make_error_code(boost::system::errc::bad_message);