NS-3 based Named Data Networking (NDN) simulator
ndnSIM 2.5: NDN, CCN, CCNx, content centric networks
API Documentation
face-uri.cpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2013-2018 Regents of the University of California,
4  * Arizona Board of Regents,
5  * Colorado State University,
6  * University Pierre & Marie Curie, Sorbonne University,
7  * Washington University in St. Louis,
8  * Beijing Institute of Technology,
9  * The University of Memphis.
10  *
11  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
12  *
13  * ndn-cxx library is free software: you can redistribute it and/or modify it under the
14  * terms of the GNU Lesser General Public License as published by the Free Software
15  * Foundation, either version 3 of the License, or (at your option) any later version.
16  *
17  * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
18  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
19  * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
20  *
21  * You should have received copies of the GNU General Public License and GNU Lesser
22  * General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
23  * <http://www.gnu.org/licenses/>.
24  *
25  * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
26  */
27 
28 #include "face-uri.hpp"
29 
30 #include "address-converter.hpp"
31 // #include "dns.hpp"
32 #include "util/string-helper.hpp"
33 
34 #include <boost/algorithm/string.hpp>
35 #include <boost/lexical_cast.hpp>
36 #include <boost/mpl/vector.hpp>
37 #include <boost/mpl/for_each.hpp>
38 #include <boost/regex.hpp>
39 #include <set>
40 #include <sstream>
41 
42 namespace ndn {
43 
44 BOOST_CONCEPT_ASSERT((boost::EqualityComparable<FaceUri>));
45 
47  : m_isV6(false)
48 {
49 }
50 
51 FaceUri::FaceUri(const std::string& uri)
52 {
53  if (!parse(uri)) {
54  BOOST_THROW_EXCEPTION(Error("Malformed URI: " + uri));
55  }
56 }
57 
58 FaceUri::FaceUri(const char* uri)
59  : FaceUri(std::string(uri))
60 {
61 }
62 
63 bool
64 FaceUri::parse(const std::string& uri)
65 {
66  m_scheme.clear();
67  m_host.clear();
68  m_port.clear();
69  m_path.clear();
70  m_isV6 = false;
71 
72  static const boost::regex protocolExp("(\\w+\\d?(\\+\\w+)?)://([^/]*)(\\/[^?]*)?");
73  boost::smatch protocolMatch;
74  if (!boost::regex_match(uri, protocolMatch, protocolExp)) {
75  return false;
76  }
77  m_scheme = protocolMatch[1];
78  const std::string& authority = protocolMatch[3];
79  m_path = protocolMatch[4];
80 
81  // pattern for IPv6 link local address enclosed in [ ], with optional port number
82  static const boost::regex v6LinkLocalExp("^\\[([a-fA-F0-9:]+)%([^\\s/:]+)\\](?:\\:(\\d+))?$");
83  // pattern for IPv6 address enclosed in [ ], with optional port number
84  static const boost::regex v6Exp("^\\[([a-fA-F0-9:]+)\\](?:\\:(\\d+))?$");
85  // pattern for Ethernet address in standard hex-digits-and-colons notation
86  static const boost::regex etherExp("^\\[((?:[a-fA-F0-9]{1,2}\\:){5}(?:[a-fA-F0-9]{1,2}))\\]$");
87  // pattern for IPv4-mapped IPv6 address, with optional port number
88  static const boost::regex v4MappedV6Exp("^\\[::ffff:(\\d+(?:\\.\\d+){3})\\](?:\\:(\\d+))?$");
89  // pattern for IPv4/hostname/fd/ifname, with optional port number
90  static const boost::regex v4HostExp("^([^:]+)(?:\\:(\\d+))?$");
91 
92  if (authority.empty()) {
93  // UNIX, internal
94  }
95  else {
96  boost::smatch match;
97  if (boost::regex_match(authority, match, v6LinkLocalExp)) {
98  m_isV6 = true;
99  m_host = match[1] + "%" + match[2];
100  m_port = match[3];
101  return true;
102  }
103 
104  m_isV6 = boost::regex_match(authority, match, v6Exp);
105  if (m_isV6 ||
106  boost::regex_match(authority, match, etherExp) ||
107  boost::regex_match(authority, match, v4MappedV6Exp) ||
108  boost::regex_match(authority, match, v4HostExp)) {
109  m_host = match[1];
110  m_port = match[2];
111  }
112  else {
113  return false;
114  }
115  }
116 
117  return true;
118 }
119 
120 FaceUri::FaceUri(const boost::asio::ip::udp::endpoint& endpoint)
121 {
122  m_isV6 = endpoint.address().is_v6();
123  m_scheme = m_isV6 ? "udp6" : "udp4";
124  m_host = endpoint.address().to_string();
125  m_port = to_string(endpoint.port());
126 }
127 
128 FaceUri::FaceUri(const boost::asio::ip::tcp::endpoint& endpoint)
129 {
130  m_isV6 = endpoint.address().is_v6();
131  m_scheme = m_isV6 ? "tcp6" : "tcp4";
132  m_host = endpoint.address().to_string();
133  m_port = to_string(endpoint.port());
134 }
135 
136 FaceUri::FaceUri(const boost::asio::ip::tcp::endpoint& endpoint, const std::string& scheme)
137 {
138  m_isV6 = endpoint.address().is_v6();
139  m_scheme = scheme;
140  m_host = endpoint.address().to_string();
141  m_port = to_string(endpoint.port());
142 }
143 
144 #ifdef BOOST_ASIO_HAS_LOCAL_SOCKETS
145 FaceUri::FaceUri(const boost::asio::local::stream_protocol::endpoint& endpoint)
146  : m_scheme("unix")
147  , m_path(endpoint.path())
148  , m_isV6(false)
149 {
150 }
151 #endif // BOOST_ASIO_HAS_LOCAL_SOCKETS
152 
153 FaceUri
155 {
156  FaceUri uri;
157  uri.m_scheme = "fd";
158  uri.m_host = to_string(fd);
159  return uri;
160 }
161 
163  : m_scheme("ether")
164  , m_host(address.toString())
165  , m_isV6(true)
166 {
167 }
168 
169 FaceUri
170 FaceUri::fromDev(const std::string& ifname)
171 {
172  FaceUri uri;
173  uri.m_scheme = "dev";
174  uri.m_host = ifname;
175  return uri;
176 }
177 
178 FaceUri
179 FaceUri::fromUdpDev(const boost::asio::ip::udp::endpoint& endpoint, const std::string& ifname)
180 {
181  FaceUri uri;
182  uri.m_scheme = endpoint.address().is_v6() ? "udp6+dev" : "udp4+dev";
183  uri.m_host = ifname;
184  uri.m_port = to_string(endpoint.port());
185  return uri;
186 }
187 
188 bool
189 FaceUri::operator==(const FaceUri& rhs) const
190 {
191  return m_isV6 == rhs.m_isV6 &&
192  m_scheme == rhs.m_scheme &&
193  m_host == rhs.m_host &&
194  m_port == rhs.m_port &&
195  m_path == rhs.m_path;
196 }
197 
198 bool
199 FaceUri::operator!=(const FaceUri& rhs) const
200 {
201  return !(*this == rhs);
202 }
203 
204 std::string
206 {
207  std::ostringstream os;
208  os << *this;
209  return os.str();
210 }
211 
212 std::ostream&
213 operator<<(std::ostream& os, const FaceUri& uri)
214 {
215  os << uri.m_scheme << "://";
216  if (uri.m_isV6) {
217  os << "[" << uri.m_host << "]";
218  }
219  else {
220  os << uri.m_host;
221  }
222  if (!uri.m_port.empty()) {
223  os << ":" << uri.m_port;
224  }
225  os << uri.m_path;
226  return os;
227 }
228 
229 
232 class CanonizeProvider : noncopyable
233 {
234 public:
235  virtual
236  ~CanonizeProvider() = default;
237 
238  virtual std::set<std::string>
239  getSchemes() const = 0;
240 
241  virtual bool
242  isCanonical(const FaceUri& faceUri) const = 0;
243 
244  virtual void
245  canonize(const FaceUri& faceUri,
246  const FaceUri::CanonizeSuccessCallback& onSuccess,
247  const FaceUri::CanonizeFailureCallback& onFailure,
248  time::nanoseconds timeout) const = 0;
249 };
250 
251 template<typename Protocol>
253 {
254 public:
255  std::set<std::string>
256  getSchemes() const override
257  {
258  return {m_baseScheme, m_v4Scheme, m_v6Scheme};
259  }
260 
261  bool
262  isCanonical(const FaceUri& faceUri) const override
263  {
264  BOOST_THROW_EXCEPTION(std::runtime_error("IP host canonization not supported"));
265  // if (faceUri.getPort().empty()) {
266  // return false;
267  // }
268  // if (!faceUri.getPath().empty()) {
269  // return false;
270  // }
271 
272  // boost::system::error_code ec;
273  // auto addr = ip::addressFromString(unescapeHost(faceUri.getHost()), ec);
274  // if (ec) {
275  // return false;
276  // }
277 
278  // bool hasCorrectScheme = (faceUri.getScheme() == m_v4Scheme && addr.is_v4()) ||
279  // (faceUri.getScheme() == m_v6Scheme && addr.is_v6());
280  // if (!hasCorrectScheme) {
281  // return false;
282  // }
283 
284  // auto checkAddressWithUri = [] (const boost::asio::ip::address& addr,
285  // const FaceUri& faceUri) -> bool {
286  // if (addr.is_v4() || !addr.to_v6().is_link_local()) {
287  // return addr.to_string() == faceUri.getHost();
288  // }
289 
290  // std::vector<std::string> addrFields, faceUriFields;
291  // std::string addrString = addr.to_string();
292  // std::string faceUriString = faceUri.getHost();
293 
294  // boost::algorithm::split(addrFields, addrString, boost::is_any_of("%"));
295  // boost::algorithm::split(faceUriFields, faceUriString, boost::is_any_of("%"));
296  // if (addrFields.size() != 2 || faceUriFields.size() != 2) {
297  // return false;
298  // }
299 
300  // if (faceUriFields[1].size() > 2 && faceUriFields[1].compare(0, 2, "25") == 0) {
301  // // %25... is accepted, but not a canonical form
302  // return false;
303  // }
304 
305  // return addrFields[0] == faceUriFields[0] &&
306  // addrFields[1] == faceUriFields[1];
307  // };
308 
309  // return checkAddressWithUri(addr, faceUri) && checkAddress(addr).first;
310  }
311 
312  void
313  canonize(const FaceUri& faceUri,
314  const FaceUri::CanonizeSuccessCallback& onSuccess,
315  const FaceUri::CanonizeFailureCallback& onFailure,
316  time::nanoseconds timeout) const override
317  {
318  BOOST_THROW_EXCEPTION(std::runtime_error("IP host canonization not supported"));
319  // if (this->isCanonical(faceUri)) {
320  // onSuccess(faceUri);
321  // return;
322  // }
323 
324  // // make a copy because caller may modify faceUri
325  // auto uri = make_shared<FaceUri>(faceUri);
326  // boost::system::error_code ec;
327  // auto ipAddress = ip::addressFromString(unescapeHost(faceUri.getHost()), ec);
328  // if (!ec) {
329  // // No need to resolve IP address if host is already an IP
330  // if ((faceUri.getScheme() == m_v4Scheme && !ipAddress.is_v4()) ||
331  // (faceUri.getScheme() == m_v6Scheme && !ipAddress.is_v6())) {
332  // return onFailure("IPv4/v6 mismatch");
333  // }
334 
335  // onDnsSuccess(uri, onSuccess, onFailure, ipAddress);
336  // }
337  // else {
338  // dns::AddressSelector addressSelector;
339  // if (faceUri.getScheme() == m_v4Scheme) {
340  // addressSelector = dns::Ipv4Only();
341  // }
342  // else if (faceUri.getScheme() == m_v6Scheme) {
343  // addressSelector = dns::Ipv6Only();
344  // }
345  // else {
346  // BOOST_ASSERT(faceUri.getScheme() == m_baseScheme);
347  // addressSelector = dns::AnyAddress();
348  // }
349 
350  // dns::asyncResolve(unescapeHost(faceUri.getHost()),
351  // bind(&IpHostCanonizeProvider<Protocol>::onDnsSuccess, this, uri, onSuccess, onFailure, _1),
352  // bind(&IpHostCanonizeProvider<Protocol>::onDnsFailure, this, uri, onFailure, _1),
353  // io, addressSelector, timeout);
354  // }
355  }
356 
357 protected:
358  explicit
359  IpHostCanonizeProvider(const std::string& baseScheme,
360  uint16_t defaultUnicastPort = 6363,
361  uint16_t defaultMulticastPort = 56363)
362  : m_baseScheme(baseScheme)
363  , m_v4Scheme(baseScheme + '4')
364  , m_v6Scheme(baseScheme + '6')
365  , m_defaultUnicastPort(defaultUnicastPort)
366  , m_defaultMulticastPort(defaultMulticastPort)
367  {
368  }
369 
370 private:
371  // void
372  // onDnsSuccess(const shared_ptr<FaceUri>& faceUri,
373  // const FaceUri::CanonizeSuccessCallback& onSuccess,
374  // const FaceUri::CanonizeFailureCallback& onFailure,
375  // const dns::IpAddress& ipAddress) const
376  // {
377  // bool isOk = false;
378  // std::string reason;
379  // std::tie(isOk, reason) = this->checkAddress(ipAddress);
380  // if (!isOk) {
381  // return onFailure(reason);
382  // }
383 
384  // uint16_t port = 0;
385  // if (faceUri->getPort().empty()) {
386  // port = ipAddress.is_multicast() ? m_defaultMulticastPort : m_defaultUnicastPort;
387  // }
388  // else {
389  // try {
390  // port = boost::lexical_cast<uint16_t>(faceUri->getPort());
391  // }
392  // catch (const boost::bad_lexical_cast&) {
393  // return onFailure("invalid port number '" + faceUri->getPort() + "'");
394  // }
395  // }
396 
397  // FaceUri canonicalUri(typename Protocol::endpoint(ipAddress, port));
398  // BOOST_ASSERT(canonicalUri.isCanonical());
399  // onSuccess(canonicalUri);
400  // }
401 
402  // void
403  // onDnsFailure(const shared_ptr<FaceUri>& faceUri,
404  // const FaceUri::CanonizeFailureCallback& onFailure,
405  // const std::string& reason) const
406  // {
407  // onFailure(reason);
408  // }
409 
414  // virtual std::pair<bool, std::string>
415  // checkAddress(const dns::IpAddress& ipAddress) const
416  // {
417  // return {true, ""};
418  // }
419 
420  static std::string
421  unescapeHost(std::string host)
422  {
423  auto escapePos = host.find("%25");
424  if (escapePos != std::string::npos && escapePos < host.size() - 3) {
425  host = unescape(host);
426  }
427  return host;
428  }
429 
430 private:
431  std::string m_baseScheme;
432  std::string m_v4Scheme;
433  std::string m_v6Scheme;
434  uint16_t m_defaultUnicastPort;
435  uint16_t m_defaultMulticastPort;
436 };
437 
438 class UdpCanonizeProvider : public IpHostCanonizeProvider<boost::asio::ip::udp>
439 {
440 public:
442  : IpHostCanonizeProvider("udp")
443  {
444  }
445 };
446 
447 class TcpCanonizeProvider : public IpHostCanonizeProvider<boost::asio::ip::tcp>
448 {
449 public:
451  : IpHostCanonizeProvider("tcp")
452  {
453  }
454 
455 protected:
456  // std::pair<bool, std::string>
457  // checkAddress(const dns::IpAddress& ipAddress) const override
458  // {
459  // if (ipAddress.is_multicast()) {
460  // return {false, "cannot use multicast address"};
461  // }
462  // return {true, ""};
463  // }
464 };
465 
467 {
468 public:
469  std::set<std::string>
470  getSchemes() const override
471  {
472  return {"ether"};
473  }
474 
475  bool
476  isCanonical(const FaceUri& faceUri) const override
477  {
478  if (!faceUri.getPort().empty()) {
479  return false;
480  }
481  if (!faceUri.getPath().empty()) {
482  return false;
483  }
484 
485  auto addr = ethernet::Address::fromString(faceUri.getHost());
486  return addr.toString() == faceUri.getHost();
487  }
488 
489  void
490  canonize(const FaceUri& faceUri,
491  const FaceUri::CanonizeSuccessCallback& onSuccess,
492  const FaceUri::CanonizeFailureCallback& onFailure,
493  time::nanoseconds timeout) const override
494  {
495  auto addr = ethernet::Address::fromString(faceUri.getHost());
496  if (addr.isNull()) {
497  return onFailure("invalid ethernet address '" + faceUri.getHost() + "'");
498  }
499 
500  FaceUri canonicalUri(addr);
501  BOOST_ASSERT(canonicalUri.isCanonical());
502  onSuccess(canonicalUri);
503  }
504 };
505 
507 {
508 public:
509  std::set<std::string>
510  getSchemes() const override
511  {
512  return {"dev"};
513  }
514 
515  bool
516  isCanonical(const FaceUri& faceUri) const override
517  {
518  return !faceUri.getHost().empty() && faceUri.getPort().empty() && faceUri.getPath().empty();
519  }
520 
521  void
522  canonize(const FaceUri& faceUri,
523  const FaceUri::CanonizeSuccessCallback& onSuccess,
524  const FaceUri::CanonizeFailureCallback& onFailure,
525  time::nanoseconds timeout) const override
526  {
527  if (faceUri.getHost().empty()) {
528  onFailure("network interface name is missing");
529  return;
530  }
531  if (!faceUri.getPort().empty()) {
532  onFailure("port number is not allowed");
533  return;
534  }
535  if (!faceUri.getPath().empty() && faceUri.getPath() != "/") { // permit trailing slash only
536  onFailure("path is not allowed");
537  return;
538  }
539 
540  FaceUri canonicalUri = FaceUri::fromDev(faceUri.getHost());
541  BOOST_ASSERT(canonicalUri.isCanonical());
542  onSuccess(canonicalUri);
543  }
544 };
545 
547 {
548 public:
549  std::set<std::string>
550  getSchemes() const override
551  {
552  return {"udp4+dev", "udp6+dev"};
553  }
554 
555  bool
556  isCanonical(const FaceUri& faceUri) const override
557  {
558  if (faceUri.getPort().empty()) {
559  return false;
560  }
561  if (!faceUri.getPath().empty()) {
562  return false;
563  }
564  return true;
565  }
566 
567  void
568  canonize(const FaceUri& faceUri,
569  const FaceUri::CanonizeSuccessCallback& onSuccess,
570  const FaceUri::CanonizeFailureCallback& onFailure,
571  time::nanoseconds timeout) const override
572  {
573  if (this->isCanonical(faceUri)) {
574  onSuccess(faceUri);
575  }
576  else {
577  onFailure("cannot canonize " + faceUri.toString());
578  }
579  }
580 };
581 
582 using CanonizeProviders = boost::mpl::vector<UdpCanonizeProvider*,
583  TcpCanonizeProvider*,
584  EtherCanonizeProvider*,
585  DevCanonizeProvider*,
587 using CanonizeProviderTable = std::map<std::string, shared_ptr<CanonizeProvider>>;
588 
590 {
591 public:
592  explicit
594  : m_providerTable(providerTable)
595  {
596  }
597 
598  template<typename CP>
599  void
601  {
602  shared_ptr<CanonizeProvider> cp = make_shared<CP>();
603  auto schemes = cp->getSchemes();
604  BOOST_ASSERT(!schemes.empty());
605 
606  for (const auto& scheme : schemes) {
607  BOOST_ASSERT(m_providerTable.count(scheme) == 0);
608  m_providerTable[scheme] = cp;
609  }
610  }
611 
612 private:
613  CanonizeProviderTable& m_providerTable;
614 };
615 
616 static const CanonizeProvider*
617 getCanonizeProvider(const std::string& scheme)
618 {
619  static CanonizeProviderTable providerTable;
620  if (providerTable.empty()) {
621  boost::mpl::for_each<CanonizeProviders>(CanonizeProviderTableInitializer(providerTable));
622  BOOST_ASSERT(!providerTable.empty());
623  }
624 
625  auto it = providerTable.find(scheme);
626  return it == providerTable.end() ? nullptr : it->second.get();
627 }
628 
629 
630 bool
631 FaceUri::canCanonize(const std::string& scheme)
632 {
633  return getCanonizeProvider(scheme) != nullptr;
634 }
635 
636 bool
638 {
639  const CanonizeProvider* cp = getCanonizeProvider(this->getScheme());
640  if (cp == nullptr) {
641  return false;
642  }
643 
644  return cp->isCanonical(*this);
645 }
646 
647 void
649  const CanonizeFailureCallback& onFailure,
650  time::nanoseconds timeout) const
651 {
652  const CanonizeProvider* cp = getCanonizeProvider(this->getScheme());
653  if (cp == nullptr) {
654  if (onFailure) {
655  onFailure("scheme not supported");
656  }
657  return;
658  }
659 
660  static CanonizeSuccessCallback successNop = bind([]{});
661  static CanonizeFailureCallback failureNop = bind([]{});
662  cp->canonize(*this,
663  onSuccess ? onSuccess : successNop,
664  onFailure ? onFailure : failureNop,
665  timeout);
666 }
667 
668 } // namespace ndn
IpHostCanonizeProvider(const std::string &baseScheme, uint16_t defaultUnicastPort=6363, uint16_t defaultMulticastPort=56363)
Definition: face-uri.cpp:359
std::set< std::string > getSchemes() const override
Definition: face-uri.cpp:510
virtual ~CanonizeProvider()=default
static Address fromString(const std::string &str)
Creates an Address from a string containing an Ethernet address in hexadecimal notation, with colons or hyphens as separators.
Definition: ethernet.cpp:92
Copyright (c) 2011-2015 Regents of the University of California.
function< void(const std::string &reason)> CanonizeFailureCallback
Definition: face-uri.hpp:165
static FaceUri fromFd(int fd)
create fd FaceUri from file descriptor
Definition: face-uri.cpp:154
bool isCanonical(const FaceUri &faceUri) const override
Definition: face-uri.cpp:556
const std::string & getHost() const
get host (domain)
Definition: face-uri.hpp:120
bool isCanonical(const FaceUri &faceUri) const override
Definition: face-uri.cpp:476
void canonize(const FaceUri &faceUri, const FaceUri::CanonizeSuccessCallback &onSuccess, const FaceUri::CanonizeFailureCallback &onFailure, time::nanoseconds timeout) const override
Definition: face-uri.cpp:490
bool operator!=(const FaceUri &rhs) const
Definition: face-uri.cpp:199
function< void(const FaceUri &)> CanonizeSuccessCallback
Definition: face-uri.hpp:164
std::ostream & operator<<(std::ostream &os, const Data &data)
Definition: data.cpp:337
static bool canCanonize(const std::string &scheme)
Definition: face-uri.cpp:631
std::string toString() const
write as a string
Definition: face-uri.cpp:205
virtual bool isCanonical(const FaceUri &faceUri) const =0
bool isCanonical(const FaceUri &faceUri) const override
Definition: face-uri.cpp:262
static const CanonizeProvider * getCanonizeProvider(const std::string &scheme)
Definition: face-uri.cpp:617
void canonize(const CanonizeSuccessCallback &onSuccess, const CanonizeFailureCallback &onFailure, time::nanoseconds timeout) const
asynchronously convert this FaceUri to canonical form
Definition: face-uri.cpp:648
const std::string & getPort() const
get port
Definition: face-uri.hpp:127
STL namespace.
void canonize(const FaceUri &faceUri, const FaceUri::CanonizeSuccessCallback &onSuccess, const FaceUri::CanonizeFailureCallback &onFailure, time::nanoseconds timeout) const override
Definition: face-uri.cpp:568
std::string toString(char sep=':') const
Converts the address to a human-readable string.
Definition: ethernet.cpp:78
void canonize(const FaceUri &faceUri, const FaceUri::CanonizeSuccessCallback &onSuccess, const FaceUri::CanonizeFailureCallback &onFailure, time::nanoseconds timeout) const override
Definition: face-uri.cpp:522
bool isCanonical(const FaceUri &faceUri) const override
Definition: face-uri.cpp:516
std::set< std::string > getSchemes() const override
Definition: face-uri.cpp:550
static FaceUri fromUdpDev(const boost::asio::ip::udp::endpoint &endpoint, const std::string &ifname)
create udp4 or udp6 NIC-associated FaceUri from endpoint and network device name
Definition: face-uri.cpp:179
std::string toString(const system_clock::TimePoint &timePoint, const std::string &format, const std::locale &locale)
Convert time point to string with specified format.
Definition: time.cpp:170
a CanonizeProvider provides FaceUri canonization functionality for a group of schemes ...
Definition: face-uri.cpp:232
bool parse(const std::string &uri)
exception-safe parsing
Definition: face-uri.cpp:64
std::string unescape(const std::string &str)
Decode a percent-encoded string.
std::set< std::string > getSchemes() const override
Definition: face-uri.cpp:470
represents the underlying protocol and address used by a Face
Definition: face-uri.hpp:44
void canonize(const FaceUri &faceUri, const FaceUri::CanonizeSuccessCallback &onSuccess, const FaceUri::CanonizeFailureCallback &onFailure, time::nanoseconds timeout) const override
Definition: face-uri.cpp:313
represents an Ethernet hardware address
Definition: ethernet.hpp:52
const std::string & getScheme() const
get scheme (protocol)
Definition: face-uri.hpp:113
virtual void canonize(const FaceUri &faceUri, const FaceUri::CanonizeSuccessCallback &onSuccess, const FaceUri::CanonizeFailureCallback &onFailure, time::nanoseconds timeout) const =0
CanonizeProviderTableInitializer(CanonizeProviderTable &providerTable)
Definition: face-uri.cpp:593
bool operator==(const FaceUri &rhs) const
Definition: face-uri.cpp:189
std::set< std::string > getSchemes() const override
Definition: face-uri.cpp:256
std::string to_string(const V &v)
Definition: backports.hpp:107
bool isCanonical() const
determine whether this FaceUri is in canonical form
Definition: face-uri.cpp:637
std::map< std::string, shared_ptr< CanonizeProvider > > CanonizeProviderTable
Definition: face-uri.cpp:587
const std::string & getPath() const
get path
Definition: face-uri.hpp:134
boost::mpl::vector< UdpCanonizeProvider *, TcpCanonizeProvider *, EtherCanonizeProvider *, DevCanonizeProvider *, UdpDevCanonizeProvider * > CanonizeProviders
Definition: face-uri.cpp:586
static FaceUri fromDev(const std::string &ifname)
create dev FaceUri from network device name
Definition: face-uri.cpp:170
virtual std::set< std::string > getSchemes() const =0