host_resolver_mdns_listener_impl.cc 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. // Copyright 2019 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "net/dns/host_resolver_mdns_listener_impl.h"
  5. #include "base/check_op.h"
  6. #include "base/notreached.h"
  7. #include "net/base/host_port_pair.h"
  8. #include "net/dns/host_cache.h"
  9. #include "net/dns/host_resolver_mdns_task.h"
  10. #include "net/dns/public/mdns_listener_update_type.h"
  11. #include "net/dns/record_parsed.h"
  12. namespace net {
  13. namespace {
  14. MdnsListenerUpdateType ConvertUpdateType(net::MDnsListener::UpdateType type) {
  15. switch (type) {
  16. case net::MDnsListener::RECORD_ADDED:
  17. return MdnsListenerUpdateType::kAdded;
  18. case net::MDnsListener::RECORD_CHANGED:
  19. return MdnsListenerUpdateType::kChanged;
  20. case net::MDnsListener::RECORD_REMOVED:
  21. return MdnsListenerUpdateType::kRemoved;
  22. }
  23. }
  24. } // namespace
  25. HostResolverMdnsListenerImpl::HostResolverMdnsListenerImpl(
  26. const HostPortPair& query_host,
  27. DnsQueryType query_type)
  28. : query_host_(query_host), query_type_(query_type) {
  29. DCHECK_NE(DnsQueryType::UNSPECIFIED, query_type_);
  30. }
  31. HostResolverMdnsListenerImpl::~HostResolverMdnsListenerImpl() {
  32. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  33. // Destroy |inner_listener_| first to cancel listening and callbacks to |this|
  34. // before anything else becomes invalid.
  35. inner_listener_ = nullptr;
  36. }
  37. int HostResolverMdnsListenerImpl::Start(Delegate* delegate) {
  38. DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
  39. DCHECK(delegate);
  40. if (initialization_error_ != OK)
  41. return initialization_error_;
  42. DCHECK(inner_listener_);
  43. delegate_ = delegate;
  44. return inner_listener_->Start() ? OK : ERR_FAILED;
  45. }
  46. void HostResolverMdnsListenerImpl::OnRecordUpdate(
  47. net::MDnsListener::UpdateType update,
  48. const RecordParsed* record) {
  49. DCHECK(delegate_);
  50. HostCache::Entry parsed_entry =
  51. HostResolverMdnsTask::ParseResult(OK, query_type_, record,
  52. query_host_.host())
  53. .CopyWithDefaultPort(query_host_.port());
  54. if (parsed_entry.error() != OK) {
  55. delegate_->OnUnhandledResult(ConvertUpdateType(update), query_type_);
  56. return;
  57. }
  58. switch (query_type_) {
  59. case DnsQueryType::UNSPECIFIED:
  60. case DnsQueryType::INTEGRITY:
  61. case DnsQueryType::HTTPS:
  62. case DnsQueryType::HTTPS_EXPERIMENTAL:
  63. NOTREACHED();
  64. break;
  65. case DnsQueryType::A:
  66. case DnsQueryType::AAAA:
  67. DCHECK(parsed_entry.ip_endpoints());
  68. DCHECK_EQ(1u, parsed_entry.ip_endpoints()->size());
  69. delegate_->OnAddressResult(ConvertUpdateType(update), query_type_,
  70. parsed_entry.ip_endpoints()->front());
  71. break;
  72. case DnsQueryType::TXT:
  73. DCHECK(parsed_entry.text_records());
  74. delegate_->OnTextResult(ConvertUpdateType(update), query_type_,
  75. parsed_entry.text_records().value());
  76. break;
  77. case DnsQueryType::PTR:
  78. case DnsQueryType::SRV:
  79. DCHECK(parsed_entry.hostnames());
  80. delegate_->OnHostnameResult(ConvertUpdateType(update), query_type_,
  81. parsed_entry.hostnames().value().front());
  82. break;
  83. }
  84. }
  85. void HostResolverMdnsListenerImpl::OnNsecRecord(const std::string& name,
  86. unsigned type) {
  87. // Do nothing. HostResolver does not support listening for NSEC records.
  88. }
  89. void HostResolverMdnsListenerImpl::OnCachePurged() {
  90. // Do nothing. HostResolver does not support listening for cache purges.
  91. }
  92. } // namespace net