diff --git a/include/ircd/net/hostport.h b/include/ircd/net/hostport.h index 7d898eae1..9bf4b31ad 100644 --- a/include/ircd/net/hostport.h +++ b/include/ircd/net/hostport.h @@ -23,6 +23,8 @@ namespace ircd::net string_view &host(hostport &); string_view string(const mutable_buffer &out, const hostport &); + string_view canonize(const mutable_buffer &out, const hostport &, const uint16_t &port = 8448); + std::string canonize(const hostport &, const uint16_t &port = 8448); } namespace ircd @@ -94,6 +96,7 @@ inline ircd::net::hostport::hostport(const string_view &amalgam) :host { + //TODO: grammar rsplit(amalgam, ':').first } { diff --git a/include/ircd/net/remote.h b/include/ircd/net/remote.h deleted file mode 100644 index a25e754fa..000000000 --- a/include/ircd/net/remote.h +++ /dev/null @@ -1,75 +0,0 @@ -// Matrix Construct -// -// Copyright (C) Matrix Construct Developers, Authors & Contributors -// Copyright (C) 2016-2018 Jason Volk -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice is present in all copies. The -// full license for this software is available in the LICENSE file. - -#pragma once -#define HAVE_IRCD_NET_REMOTE_H - -namespace ircd::net -{ - struct remote; - - string_view string(const mutable_buffer &out, const remote &); -} - -namespace ircd -{ - using net::remote; -} - -/// This structure combines features of hostport and ipport to hold a remote's -/// resolved IP in bytes, a port number, and an optional hostname string which -/// may have been used to resolve the IP, or may have been resolved from the -/// IP, or may be used for certificate Common Name verification, or may just -/// be empty, but anyway still has some use in most cases being carried along. -/// -struct ircd::net::remote -:ircd::net::ipport -{ - std::string hostname; - - explicit operator bool() const; - operator hostport() const; - bool operator!() const { return !static_cast(*this); } - bool resolved() const; - - explicit remote(const ipport &ipp) - :ipport{ipp} - {} - - explicit remote(const hostport &hostport) - :ipport{uint32_t(0), net::port(hostport)} - ,hostname{net::host(hostport)} - {} - - remote() = default; - - friend std::ostream &operator<<(std::ostream &, const remote &); -}; - -inline bool -ircd::net::remote::resolved() -const -{ - return bool(static_cast(*this)); -} - -inline ircd::net::remote::operator -hostport() -const -{ - return { hostname, port(*this) }; -} - -inline ircd::net::remote::operator -bool() -const -{ - return resolved() || !hostname.empty(); -} diff --git a/ircd/net.cc b/ircd/net.cc index 6a8bea255..2805b9e84 100644 --- a/ircd/net.cc +++ b/ircd/net.cc @@ -3306,6 +3306,39 @@ ircd::net::operator<<(std::ostream &s, const hostport &t) return s; } +std::string +ircd::net::canonize(const hostport &hp, + const uint16_t &port) +{ + const size_t len + { + size(host(hp) + 6) // optimistic ':' + portnum + }; + + return ircd::string(len, [&hp, &port] + (const mutable_buffer &buf) + { + return canonize(buf, hp, port); + }); +} + +ircd::string_view +ircd::net::canonize(const mutable_buffer &buf, + const hostport &hp, + const uint16_t &port) +{ + if(net::port(hp) == 0 || net::port(hp) == port) + return fmt::sprintf + { + buf, "%s", host(hp) + }; + + return fmt::sprintf + { + buf, "%s:%u", host(hp), net::port(hp) + }; +} + ircd::string_view ircd::net::string(const mutable_buffer &buf, const hostport &hp)