diff --git a/src/network_engine.cpp b/src/network_engine.cpp index f430144bf0febb7c3eb29b6e5107176af212ab06..fcc6436a36fb6a8788c308a2128730aa26974b4d 100644 --- a/src/network_engine.cpp +++ b/src/network_engine.cpp @@ -219,7 +219,7 @@ NetworkEngine::tellListenerExpired(Sp<Node> n, Tid socket_id, const InfoHash&, c Tid tid (n->getNewTid()); pk.pack(KEY_Q); pk.pack(QUERY_UPDATE); - pk.pack(KEY_TID); pk.pack(tid); + pk.pack(KEY_TID); pk.pack(tid); auto req = std::make_shared<Request>(MessageType::UpdateValue, tid, n, Blob(buffer.data(), buffer.data() + buffer.size()), @@ -460,9 +460,9 @@ NetworkEngine::processMessage(const uint8_t *buf, size_t buflen, SockAddr f) // process the full message process(std::move(pmsg_it->second.msg), from); partial_messages.erase(pmsg_it); - } catch (...) { + } catch (...) { return; - } + } } else scheduler.add(now + RX_TIMEOUT, std::bind(&NetworkEngine::maintainRxBuffer, this, msg->tid)); } @@ -485,11 +485,11 @@ NetworkEngine::processMessage(const uint8_t *buf, size_t buflen, SockAddr f) } if (msg->value_parts.empty()) { - try { + try { process(std::move(msg), from); - } catch(...) { + } catch(...) { return; - } + } } else { // starting partial message session auto k = msg->tid; @@ -955,8 +955,8 @@ NetworkEngine::sendValueParts(Tid tid, const std::vector<Blob>& svals, const Soc pk.pack(KEY_TID); pk.pack(tid); pk.pack(KEY_V); pk.pack_map(1); pk.pack(i); pk.pack_map(2); - pk.pack(std::string("o")); pk.pack(start); - pk.pack(std::string("d")); pk.pack_bin(end-start); + pk.pack("o"sv); pk.pack(start); + pk.pack("d"sv); pk.pack_bin(end-start); pk.pack_bin_body((const char*)v.data()+start, end-start); send(addr, buffer.data(), buffer.size()); start = end; @@ -998,8 +998,8 @@ NetworkEngine::sendNodesValues(const SockAddr& addr, Tid tid, const Blob& nodes, auto fields = query.select.getSelection(); pk.pack(KEY_REQ_FIELDS); pk.pack_map(2); - pk.pack(std::string("f")); pk.pack(fields); - pk.pack(std::string("v")); pk.pack_array(st.size()*fields.size()); + pk.pack("f"sv); pk.pack(fields); + pk.pack("v"sv); pk.pack_array(st.size()*fields.size()); for (const auto& v : st) v->msgpack_pack_fields(fields, pk); //DHT_LOG_DBG("sending closest nodes (%d+%d nodes.), %u value headers containing %u fields", diff --git a/src/parsed_message.h b/src/parsed_message.h index fea98d4dccbbd0b4378d5c7916d817bb0889e983..6f5063c06704ce8bd5246209af58b173e46d189c 100644 --- a/src/parsed_message.h +++ b/src/parsed_message.h @@ -22,47 +22,50 @@ #include "net.h" #include <map> +#include <string_view> + +using namespace std::literals; namespace dht { namespace net { -static const std::string KEY_Y {"y"}; -static const std::string KEY_R {"r"}; -static const std::string KEY_U {"u"}; -static const std::string KEY_E {"e"}; -static const std::string KEY_V {"p"}; -static const std::string KEY_TID {"t"}; -static const std::string KEY_UA {"v"}; -static const std::string KEY_NETID {"n"}; -static const std::string KEY_ISCLIENT {"s"}; -static const std::string KEY_Q {"q"}; -static const std::string KEY_A {"a"}; +static constexpr auto KEY_Y = "y"sv; +static constexpr auto KEY_R = "r"sv; +static constexpr auto KEY_U = "u"sv; +static constexpr auto KEY_E = "e"sv; +static constexpr auto KEY_V = "p"sv; +static constexpr auto KEY_TID = "t"sv; +static constexpr auto KEY_UA = "v"sv; +static constexpr auto KEY_NETID = "n"sv; +static constexpr auto KEY_ISCLIENT = "s"sv; +static constexpr auto KEY_Q = "q"sv; +static constexpr auto KEY_A = "a"sv; -static const std::string KEY_REQ_SID {"sid"}; -static const std::string KEY_REQ_ID {"id"}; -static const std::string KEY_REQ_H {"h"}; -static const std::string KEY_REQ_TARGET {"target"}; -static const std::string KEY_REQ_QUERY {"q"}; -static const std::string KEY_REQ_TOKEN {"token"}; -static const std::string KEY_REQ_VALUE_ID {"vid"}; -static const std::string KEY_REQ_NODES4 {"n4"}; -static const std::string KEY_REQ_NODES6 {"n6"}; -static const std::string KEY_REQ_CREATION {"c"}; -static const std::string KEY_REQ_ADDRESS {"sa"}; -static const std::string KEY_REQ_VALUES {"values"}; -static const std::string KEY_REQ_EXPIRED {"exp"}; -static const std::string KEY_REQ_REFRESHED {"re"}; -static const std::string KEY_REQ_FIELDS {"fileds"}; -static const std::string KEY_REQ_WANT {"w"}; -static const std::string KEY_VERSION {"ve"}; +static constexpr auto KEY_REQ_SID = "sid"sv; +static constexpr auto KEY_REQ_ID = "id"sv; +static constexpr auto KEY_REQ_H = "h"sv; +static constexpr auto KEY_REQ_TARGET = "target"sv; +static constexpr auto KEY_REQ_QUERY = "q"sv; +static constexpr auto KEY_REQ_TOKEN = "token"sv; +static constexpr auto KEY_REQ_VALUE_ID = "vid"sv; +static constexpr auto KEY_REQ_NODES4 = "n4"sv; +static constexpr auto KEY_REQ_NODES6 = "n6"sv; +static constexpr auto KEY_REQ_CREATION = "c"sv; +static constexpr auto KEY_REQ_ADDRESS = "sa"sv; +static constexpr auto KEY_REQ_VALUES = "values"sv; +static constexpr auto KEY_REQ_EXPIRED = "exp"sv; +static constexpr auto KEY_REQ_REFRESHED = "re"sv; +static constexpr auto KEY_REQ_FIELDS = "fileds"sv; +static constexpr auto KEY_REQ_WANT = "w"sv; +static constexpr auto KEY_VERSION = "ve"sv; -static const std::string QUERY_PING {"ping"}; -static const std::string QUERY_FIND {"find"}; -static const std::string QUERY_GET {"get"}; -static const std::string QUERY_UPDATE {"update"}; -static const std::string QUERY_PUT {"put"}; -static const std::string QUERY_LISTEN {"listen"}; -static const std::string QUERY_REFRESH {"refresh"}; +static constexpr auto QUERY_PING = "ping"sv; +static constexpr auto QUERY_FIND = "find"sv; +static constexpr auto QUERY_GET = "get"sv; +static constexpr auto QUERY_UPDATE = "update"sv; +static constexpr auto QUERY_PUT = "put"sv; +static constexpr auto QUERY_LISTEN = "listen"sv; +static constexpr auto QUERY_REFRESH = "refresh"sv; Tid unpackTid(const msgpack::object& o) { switch (o.type) { @@ -173,14 +176,14 @@ ParsedMessage::msgpack_unpack(const msgpack::object& msg) msgpack::object* e; msgpack::object* v; msgpack::object* a; - std::string q; + std::string_view q; } parsed {}; for (unsigned i = 0; i < msg.via.map.size; i++) { auto& o = msg.via.map.ptr[i]; if (o.key.type != msgpack::type::STR) continue; - auto key = o.key.as<std::string>(); + auto key = o.key.as<std::string_view>(); if (key == KEY_Y) parsed.y = &o.val; else if (key == KEY_R) @@ -200,7 +203,7 @@ ParsedMessage::msgpack_unpack(const msgpack::object& msg) else if (key == KEY_ISCLIENT) is_client = o.val.as<bool>(); else if (key == KEY_Q) - parsed.q = o.val.as<std::string>(); + parsed.q = o.val.as<std::string_view>(); else if (key == KEY_A) parsed.a = &o.val; } @@ -213,7 +216,7 @@ ParsedMessage::msgpack_unpack(const msgpack::object& msg) type = MessageType::ValueData; else if (parsed.u) type = MessageType::ValueUpdate; - else if (parsed.y and parsed.y->as<std::string>() != "q") + else if (parsed.y and parsed.y->as<std::string_view>() != "q"sv) throw msgpack::type_error(); else if (parsed.q == QUERY_PING) type = MessageType::Ping; @@ -267,7 +270,7 @@ ParsedMessage::msgpack_unpack(const msgpack::object& msg) auto& o = req.via.map.ptr[i]; if (o.key.type != msgpack::type::STR) continue; - auto key = o.key.as<std::string>(); + auto key = o.key.as<std::string_view>(); if (key == KEY_REQ_SID) socket_id = unpackTid(o.val); else if (key == KEY_REQ_ID)