mirror of
https://github.com/matrix-construct/construct
synced 2024-11-19 00:10:59 +01:00
ircd::net: Add suite to print a hostname and port or just hostname based on portnum canon.
This commit is contained in:
parent
368b8c4516
commit
cadabb5521
3 changed files with 36 additions and 75 deletions
|
@ -23,6 +23,8 @@ namespace ircd::net
|
||||||
string_view &host(hostport &);
|
string_view &host(hostport &);
|
||||||
|
|
||||||
string_view string(const mutable_buffer &out, const 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
|
namespace ircd
|
||||||
|
@ -94,6 +96,7 @@ inline
|
||||||
ircd::net::hostport::hostport(const string_view &amalgam)
|
ircd::net::hostport::hostport(const string_view &amalgam)
|
||||||
:host
|
:host
|
||||||
{
|
{
|
||||||
|
//TODO: grammar
|
||||||
rsplit(amalgam, ':').first
|
rsplit(amalgam, ':').first
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,75 +0,0 @@
|
||||||
// Matrix Construct
|
|
||||||
//
|
|
||||||
// Copyright (C) Matrix Construct Developers, Authors & Contributors
|
|
||||||
// Copyright (C) 2016-2018 Jason Volk <jason@zemos.net>
|
|
||||||
//
|
|
||||||
// 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<bool>(*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<const ipport &>(*this));
|
|
||||||
}
|
|
||||||
|
|
||||||
inline ircd::net::remote::operator
|
|
||||||
hostport()
|
|
||||||
const
|
|
||||||
{
|
|
||||||
return { hostname, port(*this) };
|
|
||||||
}
|
|
||||||
|
|
||||||
inline ircd::net::remote::operator
|
|
||||||
bool()
|
|
||||||
const
|
|
||||||
{
|
|
||||||
return resolved() || !hostname.empty();
|
|
||||||
}
|
|
33
ircd/net.cc
33
ircd/net.cc
|
@ -3306,6 +3306,39 @@ ircd::net::operator<<(std::ostream &s, const hostport &t)
|
||||||
return s;
|
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::string_view
|
||||||
ircd::net::string(const mutable_buffer &buf,
|
ircd::net::string(const mutable_buffer &buf,
|
||||||
const hostport &hp)
|
const hostport &hp)
|
||||||
|
|
Loading…
Reference in a new issue