@@ -495,44 +495,11 @@ namespace nmos
495495 update_service (advertiser, service, domain, settings, std::move (add_records));
496496 }
497497
498- enum discovery_mode
499- {
500- discovery_mode_default = 0 ,
501- discovery_mode_name = 1 ,
502- discovery_mode_addresses = 2
503- };
504-
505498 namespace details
506499 {
507500 typedef std::vector<resolved_service> resolved_services;
508501
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)
536503 {
537504 return discovery.browse ([=, &discovery](const mdns::browse_result& resolving)
538505 {
@@ -588,12 +555,17 @@ namespace nmos
588555 .set_path (U (" /x-nmos/" ) + utility::s2us (details::service_api (service)));
589556 }
590557
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 ();
592561
593- for (const auto & host : resolved_hosts )
562+ for (const auto & ip_address : resolved. ip_addresses )
594563 {
564+ // sneakily stash the Host header in user info
565+ // cf. nmos::details::make_http_client
595566 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))
597569 .to_uri ()
598570 });
599571 }
@@ -618,7 +590,9 @@ namespace nmos
618590 }
619591 }
620592
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)
622596 {
623597 const auto absolute_timeout = std::chrono::steady_clock::now () + timeout;
624598
@@ -646,8 +620,8 @@ namespace nmos
646620 };
647621
648622 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)
651625 };
652626
653627 // when either task is completed, cancel and wait for the other to be completed
@@ -675,12 +649,12 @@ namespace nmos
675649 }
676650 else
677651 {
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);
679653 }
680654 }
681655 else
682656 {
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);
684658 }
685659
686660 return resolve_task.then ([results, randomize](bool )
@@ -722,9 +696,11 @@ namespace nmos
722696 });
723697 }
724698
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)
726702 {
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)
728704 {
729705 // add the version to each uri
730706 return boost::copy_range<std::list<web::uri>>(resolved_services | boost::adaptors::transformed ([](const resolved_service& s)
@@ -734,18 +710,10 @@ namespace nmos
734710 });
735711 }
736712
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-
744713 // helper function for resolving instances of the specified service (API) based on the specified settings
745714 // with the highest version, highest priority instances at the front, and services with the same priority ordered randomly
746715 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)
747716 {
748- const auto mode = discovery_mode (nmos::experimental::fields::discovery_mode (settings));
749717 const auto browse_domain = utility::us2s (nmos::get_domain (settings));
750718 const auto versions = details::service_versions (service, settings);
751719 const auto priorities = details::service_priorities (service, settings);
@@ -756,21 +724,13 @@ namespace nmos
756724 // when no cancellation token is specified
757725 const auto timeout = token.is_cancelable () ? nmos::fields::discovery_backoff_max (settings) : 1 ;
758726
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);
767728 }
768729
769730 // helper function for resolving instances of the specified service (API) based on the specified settings
770731 // with the highest version, highest priority instances at the front, and services with the same priority ordered randomly
771732 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)
772733 {
773- const auto mode = discovery_mode (nmos::experimental::fields::discovery_mode (settings));
774734 const auto browse_domain = utility::us2s (nmos::get_domain (settings));
775735 const auto versions = details::service_versions (service, settings);
776736 const auto priorities = details::service_priorities (service, settings);
@@ -781,7 +741,7 @@ namespace nmos
781741 // when no cancellation token is specified
782742 const auto timeout = token.is_cancelable () ? nmos::fields::discovery_backoff_max (settings) : 1 ;
783743
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);
785745 }
786746 }
787747}
0 commit comments