Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/core/StarHostAddress.hpp
blob: 07f27a9b65b5849e65a6e1e3e06e1029061d901b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#pragma once

#include "StarString.hpp"
#include "StarEither.hpp"

namespace Star {

STAR_EXCEPTION(NetworkException, IOException);

STAR_CLASS(HostAddress);

enum class NetworkMode {
  IPv4,
  IPv6
};

class HostAddress {
public:
  static HostAddress localhost(NetworkMode mode = NetworkMode::IPv4);

  // Returns either error or valid HostAddress
  static Either<String, HostAddress> lookup(String const& address);

  // If address is nullptr, constructs the zero address.
  HostAddress(NetworkMode mode = NetworkMode::IPv4, uint8_t* address = nullptr);
  // Throws if address is not valid
  explicit HostAddress(String const& address);

  NetworkMode mode() const;
  uint8_t const* bytes() const;
  uint8_t octet(size_t i) const;
  size_t size() const;

  bool isLocalHost() const;
  bool isZero() const;

  bool operator==(HostAddress const& a) const;

private:
  void set(String const& address);
  void set(NetworkMode mode, uint8_t const* addr);

  NetworkMode m_mode;
  uint8_t m_address[16];
};

std::ostream& operator<<(std::ostream& os, HostAddress const& address);

template <>
struct hash<HostAddress> {
  size_t operator()(HostAddress const& address) const;
};

class HostAddressWithPort {
public:
  // Returns either error or valid HostAddressWithPort
  static Either<String, HostAddressWithPort> lookup(String const& address, uint16_t port);
  // Format may have [] brackets around address or not, to distinguish address
  // portion from port portion.
  static Either<String, HostAddressWithPort> lookupWithPort(String const& address);

  HostAddressWithPort();
  HostAddressWithPort(HostAddress const& address, uint16_t port);
  HostAddressWithPort(NetworkMode mode, uint8_t* address, uint16_t port);
  // Throws if address or port is not valid
  HostAddressWithPort(String const& address, uint16_t port);
  explicit HostAddressWithPort(String const& address);

  HostAddress address() const;
  uint16_t port() const;

  bool operator==(HostAddressWithPort const& a) const;

private:
  HostAddress m_address;
  uint16_t m_port;
};

std::ostream& operator<<(std::ostream& os, HostAddressWithPort const& address);

template <>
struct hash<HostAddressWithPort> {
  size_t operator()(HostAddressWithPort const& address) const;
};

}

template <> struct fmt::formatter<Star::HostAddress> : ostream_formatter {};
template <> struct fmt::formatter<Star::HostAddressWithPort> : ostream_formatter {};