4#include "Stroika/Frameworks/StroikaPreComp.h"
8#include "Stroika/Foundation/Containers/Sequence.h"
10#include "LocationProvider.h"
16using namespace Stroika::Frameworks::UPnP::SSDP;
17using namespace Stroika::Frameworks::UPnP::SSDP::Server;
23 return not(a.GetAddressFamily () == InternetAddress::AddressFamily::V6 and a.IsLinkLocalAddress ());
52 return [bindings, path, scheme] (
const LocationContext& context) -> optional<URI> {
53 const InternetAddress& thisMachineAddressOnCandidateNetwork = context.fLocalAddress;
54 if (not Advertisable_ (thisMachineAddressOnCandidateNetwork)) {
58 thisMachineAddressOnCandidateNetwork.
GetAddressFamily () == InternetAddress::AddressFamily::V4 ? V4::kAddrAny : V6::kAddrAny;
59 optional<SocketAddress> b = bindings.First ([&] (
const SocketAddress& sa) {
68 return URI{scheme,
URI::Authority{thisMachineAddressOnCandidateNetwork, b->GetPort ()}, path};
77LocationProvider Server::FixedLocation (
const URI& url)
79 return [url] ([[maybe_unused]]
const LocationContext& context) -> optional<URI> {
return url; };
87LocationProvider Server::LocationFillingInHost (
const URI& location)
90 optional<URI::Authority> authority = location.
GetAuthority ();
91 if (authority and authority->GetHost ()) {
94 if (not Advertisable_ (context.fLocalAddress)) {
98 useAuthority.SetHost (context.fLocalAddress);
99 URI result = location;
100 result.SetAuthority (useAuthority);
115 if (interfaces.
Any ([&] (
const Interface& i) { return i.fBindings.fAddresses.Contains (asker); })) {
119 for (
const CIDR& subnet : i.fBindings.fAddressRanges) {
121 return a.GetAddressFamily () == subnet.GetBaseInternetAddress ().GetAddressFamily () and subnet.GetRange ().Contains (a);
123 if (inSubnet (asker)) {
124 if (optional<InternetAddress> local = i.
fBindings.fAddresses.First (inSubnet)) {
135 optional<InternetAddress> linkLocal;
137 if (a.GetAddressFamily () == f) {
138 if (not a.IsLinkLocalAddress ()) {
Similar to String, but intended to more efficiently construct a String. Mutable type (String is large...
String is like std::u32string, except it is much easier to use, often much more space efficient,...
A generalization of a vector: a container whose elements are keyed by the natural numbers.
nonvirtual bool IsLinkLocalAddress() const
nonvirtual constexpr AddressFamily GetAddressFamily() const
nonvirtual InternetAddress GetInternetAddress() const
nonvirtual bool IsInternetAddress() const
nonvirtual optional< Authority > GetAuthority() const
Iterable<T> is a base class for containers which easily produce an Iterator<T> to traverse them.
nonvirtual bool Any() const
Any() same as not empty (); Any (includeIfTrue) returns true iff includeIfTrue returns true on any va...
String ToString(T &&t, ARGS... args)
Return a debug-friendly, display version of the argument: not guaranteed parsable or usable except fo...
nonvirtual String ToString() const
optional< SocketAddress > fAsker
InternetAddress fLocalAddress