@@ -495,44 +495,11 @@ namespace nmos
495
495
update_service (advertiser, service, domain, settings, std::move (add_records));
496
496
}
497
497
498
- enum discovery_mode
499
- {
500
- discovery_mode_default = 0 ,
501
- discovery_mode_name = 1 ,
502
- discovery_mode_addresses = 2
503
- };
504
-
505
498
namespace details
506
499
{
507
500
typedef std::vector<resolved_service> resolved_services;
508
501
509
- std::vector<utility::string_t > get_resolved_hosts (const mdns::resolve_result& resolved, const nmos::service_protocol& resolved_proto, discovery_mode mode)
510
- {
511
- std::vector<utility::string_t > results;
512
-
513
- // by default, use the host name if secure communications are in use
514
- if (mode == discovery_mode_name || (mode == discovery_mode_default && is_service_protocol_secure (resolved_proto)))
515
- {
516
- auto host_name = utility::s2us (resolved.host_name );
517
- // remove a trailing '.' to turn an FQDN into a DNS name, for SSL certificate matching
518
- // hmm, this might be more appropriately done by tweaking the Host header in the client request?
519
- if (!host_name.empty () && U (' .' ) == host_name.back ()) host_name.pop_back ();
520
-
521
- results.push_back (host_name);
522
- }
523
-
524
- if (mode == discovery_mode_addresses || (mode == discovery_mode_default && !is_service_protocol_secure (resolved_proto)))
525
- {
526
- for (const auto & ip_address : resolved.ip_addresses )
527
- {
528
- results.push_back (utility::s2us (ip_address));
529
- }
530
- }
531
-
532
- return results;
533
- }
534
-
535
- pplx::task<bool > resolve_service (std::shared_ptr<resolved_services> results, mdns::service_discovery& discovery, discovery_mode discovery_mode, const nmos::service_type& service, const std::string& browse_domain, const std::set<nmos::api_version>& api_ver, const std::pair<nmos::service_priority, nmos::service_priority>& priorities, const std::set<nmos::service_protocol>& api_proto, const std::set<bool >& api_auth, const std::chrono::steady_clock::time_point& timeout, const pplx::cancellation_token& token)
502
+ pplx::task<bool > resolve_service (std::shared_ptr<resolved_services> results, mdns::service_discovery& discovery, const nmos::service_type& service, const std::string& browse_domain, const std::set<nmos::api_version>& api_ver, const std::pair<nmos::service_priority, nmos::service_priority>& priorities, const std::set<nmos::service_protocol>& api_proto, const std::set<bool >& api_auth, const std::chrono::steady_clock::time_point& timeout, const pplx::cancellation_token& token)
536
503
{
537
504
return discovery.browse ([=, &discovery](const mdns::browse_result& resolving)
538
505
{
@@ -588,12 +555,17 @@ namespace nmos
588
555
.set_path (U (" /x-nmos/" ) + utility::s2us (details::service_api (service)));
589
556
}
590
557
591
- auto resolved_hosts = get_resolved_hosts (resolved, resolved_proto, discovery_mode);
558
+ auto host_name = utility::s2us (resolved.host_name );
559
+ // remove a trailing '.' to turn an FQDN into a DNS name, for SSL certificate matching
560
+ if (!host_name.empty () && U (' .' ) == host_name.back ()) host_name.pop_back ();
592
561
593
- for (const auto & host : resolved_hosts )
562
+ for (const auto & ip_address : resolved. ip_addresses )
594
563
{
564
+ // sneakily stash the Host header in user info
565
+ // cf. nmos::details::make_http_client
595
566
results->push_back ({ { *resolved_ver, resolved_pri }, resolved_uri
596
- .set_host (host)
567
+ .set_user_info (host_name)
568
+ .set_host (utility::s2us (ip_address))
597
569
.to_uri ()
598
570
});
599
571
}
@@ -618,7 +590,9 @@ namespace nmos
618
590
}
619
591
}
620
592
621
- pplx::task<std::list<resolved_service>> resolve_service_ (mdns::service_discovery& discovery, discovery_mode mode, const nmos::service_type& service, const std::string& browse_domain, const std::set<nmos::api_version>& api_ver, const std::pair<nmos::service_priority, nmos::service_priority>& priorities, const std::set<nmos::service_protocol>& api_proto, const std::set<bool >& api_auth, bool randomize, const std::chrono::steady_clock::duration& timeout, const pplx::cancellation_token& token)
593
+ // helper function for resolving instances of the specified service (API)
594
+ // with the highest version, highest priority instances at the front, and optionally services with the same priority ordered randomly
595
+ pplx::task<std::list<resolved_service>> resolve_service_ (mdns::service_discovery& discovery, const nmos::service_type& service, const std::string& browse_domain, const std::set<nmos::api_version>& api_ver, const std::pair<nmos::service_priority, nmos::service_priority>& priorities, const std::set<nmos::service_protocol>& api_proto, const std::set<bool >& api_auth, bool randomize, const std::chrono::steady_clock::duration& timeout, const pplx::cancellation_token& token)
622
596
{
623
597
const auto absolute_timeout = std::chrono::steady_clock::now () + timeout;
624
598
@@ -646,8 +620,8 @@ namespace nmos
646
620
};
647
621
648
622
const std::vector<pplx::task<bool >> both_tasks{
649
- details::resolve_service (both_results[0 ], discovery, mode, nmos::service_types::register_, browse_domain, api_ver, priorities, api_proto, api_auth, absolute_timeout, linked_token),
650
- details::resolve_service (both_results[1 ], discovery, mode, service, browse_domain, api_ver, priorities, api_proto, api_auth, absolute_timeout, linked_token)
623
+ details::resolve_service (both_results[0 ], discovery, nmos::service_types::register_, browse_domain, api_ver, priorities, api_proto, api_auth, absolute_timeout, linked_token),
624
+ details::resolve_service (both_results[1 ], discovery, service, browse_domain, api_ver, priorities, api_proto, api_auth, absolute_timeout, linked_token)
651
625
};
652
626
653
627
// when either task is completed, cancel and wait for the other to be completed
@@ -675,12 +649,12 @@ namespace nmos
675
649
}
676
650
else
677
651
{
678
- resolve_task = details::resolve_service (results, discovery, mode, nmos::service_types::register_, browse_domain, api_ver, priorities, api_proto, api_auth, absolute_timeout, token);
652
+ resolve_task = details::resolve_service (results, discovery, nmos::service_types::register_, browse_domain, api_ver, priorities, api_proto, api_auth, absolute_timeout, token);
679
653
}
680
654
}
681
655
else
682
656
{
683
- resolve_task = details::resolve_service (results, discovery, mode, service, browse_domain, api_ver, priorities, api_proto, api_auth, absolute_timeout, token);
657
+ resolve_task = details::resolve_service (results, discovery, service, browse_domain, api_ver, priorities, api_proto, api_auth, absolute_timeout, token);
684
658
}
685
659
686
660
return resolve_task.then ([results, randomize](bool )
@@ -722,9 +696,11 @@ namespace nmos
722
696
});
723
697
}
724
698
725
- pplx::task<std::list<web::uri>> resolve_service (mdns::service_discovery& discovery, discovery_mode mode, const nmos::service_type& service, const std::string& browse_domain, const std::set<nmos::api_version>& api_ver, const std::pair<nmos::service_priority, nmos::service_priority>& priorities, const std::set<nmos::service_protocol>& api_proto, const std::set<bool >& api_auth, bool randomize, const std::chrono::steady_clock::duration& timeout, const pplx::cancellation_token& token)
699
+ // helper function for resolving instances of the specified service (API)
700
+ // with the highest version, highest priority instances at the front, and optionally services with the same priority ordered randomly
701
+ pplx::task<std::list<web::uri>> resolve_service (mdns::service_discovery& discovery, const nmos::service_type& service, const std::string& browse_domain, const std::set<nmos::api_version>& api_ver, const std::pair<nmos::service_priority, nmos::service_priority>& priorities, const std::set<nmos::service_protocol>& api_proto, const std::set<bool >& api_auth, bool randomize, const std::chrono::steady_clock::duration& timeout, const pplx::cancellation_token& token)
726
702
{
727
- return resolve_service_ (discovery, mode, service, browse_domain, api_ver, priorities, api_proto, api_auth, randomize, timeout, token).then ([](std::list<resolved_service> resolved_services)
703
+ return resolve_service_ (discovery, service, browse_domain, api_ver, priorities, api_proto, api_auth, randomize, timeout, token).then ([](std::list<resolved_service> resolved_services)
728
704
{
729
705
// add the version to each uri
730
706
return boost::copy_range<std::list<web::uri>>(resolved_services | boost::adaptors::transformed ([](const resolved_service& s)
@@ -734,18 +710,10 @@ namespace nmos
734
710
});
735
711
}
736
712
737
- // helper function for resolving instances of the specified service (API)
738
- // with the highest version, highest priority instances at the front, and (by default) services with the same priority ordered randomly
739
- pplx::task<std::list<web::uri>> resolve_service (mdns::service_discovery& discovery, const nmos::service_type& service, const std::string& browse_domain, const std::set<nmos::api_version>& api_ver, const std::pair<nmos::service_priority, nmos::service_priority>& priorities, const std::set<nmos::service_protocol>& api_proto, const std::set<bool >& api_auth, bool randomize, const std::chrono::steady_clock::duration& timeout, const pplx::cancellation_token& token)
740
- {
741
- return resolve_service (discovery, discovery_mode_default, service, browse_domain, api_ver, priorities, api_proto, api_auth, randomize, timeout, token);
742
- }
743
-
744
713
// helper function for resolving instances of the specified service (API) based on the specified settings
745
714
// with the highest version, highest priority instances at the front, and services with the same priority ordered randomly
746
715
pplx::task<std::list<web::uri>> resolve_service (mdns::service_discovery& discovery, const nmos::service_type& service, const nmos::settings& settings, const pplx::cancellation_token& token)
747
716
{
748
- const auto mode = discovery_mode (nmos::experimental::fields::discovery_mode (settings));
749
717
const auto browse_domain = utility::us2s (nmos::get_domain (settings));
750
718
const auto versions = details::service_versions (service, settings);
751
719
const auto priorities = details::service_priorities (service, settings);
@@ -756,21 +724,13 @@ namespace nmos
756
724
// when no cancellation token is specified
757
725
const auto timeout = token.is_cancelable () ? nmos::fields::discovery_backoff_max (settings) : 1 ;
758
726
759
- return resolve_service (discovery, mode, service, browse_domain, versions, priorities, protocols, authorization, true , std::chrono::seconds (timeout), token);
760
- }
761
-
762
- // helper function for resolving instances of the specified service (API)
763
- // with the highest version, highest priority instances at the front, and (by default) services with the same priority ordered randomly
764
- pplx::task<std::list<resolved_service>> resolve_service_ (mdns::service_discovery& discovery, const nmos::service_type& service, const std::string& browse_domain, const std::set<nmos::api_version>& api_ver, const std::pair<nmos::service_priority, nmos::service_priority>& priorities, const std::set<nmos::service_protocol>& api_proto, const std::set<bool >& api_auth, bool randomize, const std::chrono::steady_clock::duration& timeout, const pplx::cancellation_token& token)
765
- {
766
- return resolve_service_ (discovery, discovery_mode_default, service, browse_domain, api_ver, priorities, api_proto, api_auth, randomize, timeout, token);
727
+ return resolve_service (discovery, service, browse_domain, versions, priorities, protocols, authorization, true , std::chrono::duration_cast<std::chrono::steady_clock::duration>(std::chrono::seconds (timeout)), token);
767
728
}
768
729
769
730
// helper function for resolving instances of the specified service (API) based on the specified settings
770
731
// with the highest version, highest priority instances at the front, and services with the same priority ordered randomly
771
732
pplx::task<std::list<resolved_service>> resolve_service_ (mdns::service_discovery& discovery, const nmos::service_type& service, const nmos::settings& settings, const pplx::cancellation_token& token)
772
733
{
773
- const auto mode = discovery_mode (nmos::experimental::fields::discovery_mode (settings));
774
734
const auto browse_domain = utility::us2s (nmos::get_domain (settings));
775
735
const auto versions = details::service_versions (service, settings);
776
736
const auto priorities = details::service_priorities (service, settings);
@@ -781,7 +741,7 @@ namespace nmos
781
741
// when no cancellation token is specified
782
742
const auto timeout = token.is_cancelable () ? nmos::fields::discovery_backoff_max (settings) : 1 ;
783
743
784
- return resolve_service_ (discovery, mode, service, browse_domain, versions, priorities, protocols, authorization, true , std::chrono::seconds (timeout), token);
744
+ return resolve_service_ (discovery, service, browse_domain, versions, priorities, protocols, authorization, true , std::chrono::duration_cast<std::chrono::steady_clock::duration>( std::chrono:: seconds (timeout) ), token);
785
745
}
786
746
}
787
747
}
0 commit comments