host_resolver.h 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. // Copyright 2018 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. #ifndef SERVICES_NETWORK_HOST_RESOLVER_H_
  5. #define SERVICES_NETWORK_HOST_RESOLVER_H_
  6. #include <memory>
  7. #include <set>
  8. #include <string>
  9. #include "base/callback.h"
  10. #include "base/component_export.h"
  11. #include "base/containers/unique_ptr_adapters.h"
  12. #include "base/memory/raw_ptr.h"
  13. #include "base/memory/weak_ptr.h"
  14. #include "mojo/public/cpp/bindings/pending_receiver.h"
  15. #include "mojo/public/cpp/bindings/pending_remote.h"
  16. #include "mojo/public/cpp/bindings/receiver.h"
  17. #include "net/dns/public/dns_query_type.h"
  18. #include "services/network/public/mojom/host_resolver.mojom.h"
  19. namespace net {
  20. class HostResolver;
  21. class HostPortPair;
  22. class NetLog;
  23. class NetworkIsolationKey;
  24. } // namespace net
  25. namespace network {
  26. class HostResolverMdnsListener;
  27. class ResolveHostRequest;
  28. class COMPONENT_EXPORT(NETWORK_SERVICE) HostResolver
  29. : public mojom::HostResolver {
  30. public:
  31. using ConnectionShutdownCallback = base::OnceCallback<void(HostResolver*)>;
  32. // Constructs and binds to the given mojom::HostResolver pipe. On pipe close,
  33. // cancels all outstanding receivers (whether made through the pipe or by
  34. // directly calling ResolveHost()) with ERR_FAILED. Also on pipe close, calls
  35. // |connection_shutdown_callback| and passes |this| to notify that the
  36. // resolver has cancelled all receivers and may be cleaned up.
  37. HostResolver(mojo::PendingReceiver<mojom::HostResolver> resolver_receiver,
  38. ConnectionShutdownCallback connection_shutdown_callback,
  39. net::HostResolver* internal_resolver,
  40. net::NetLog* net_log);
  41. // Constructor for when the resolver will not be bound to a
  42. // mojom::HostResolver pipe, eg because it is handling ResolveHost requests
  43. // made directly on NetworkContext.
  44. HostResolver(net::HostResolver* internal_resolver, net::NetLog* net_log);
  45. HostResolver(const HostResolver&) = delete;
  46. HostResolver& operator=(const HostResolver&) = delete;
  47. ~HostResolver() override;
  48. void ResolveHost(
  49. const net::HostPortPair& host,
  50. const net::NetworkIsolationKey& network_isolation_key,
  51. mojom::ResolveHostParametersPtr optional_parameters,
  52. mojo::PendingRemote<mojom::ResolveHostClient> response_client) override;
  53. void MdnsListen(const net::HostPortPair& host,
  54. net::DnsQueryType query_type,
  55. mojo::PendingRemote<mojom::MdnsListenClient> response_client,
  56. MdnsListenCallback callback) override;
  57. size_t GetNumOutstandingRequestsForTesting() const;
  58. // Sets a global callback when a ResolveHost call arrives.
  59. using ResolveHostCallback =
  60. base::RepeatingCallback<void(const std::string& host)>;
  61. static void SetResolveHostCallbackForTesting(ResolveHostCallback callback);
  62. private:
  63. void AsyncSetUp();
  64. void OnResolveHostComplete(ResolveHostRequest* request, int error);
  65. void OnMdnsListenerCancelled(HostResolverMdnsListener* listener);
  66. void OnConnectionError();
  67. mojo::Receiver<mojom::HostResolver> receiver_;
  68. mojo::PendingReceiver<mojom::HostResolver> pending_receiver_;
  69. ConnectionShutdownCallback connection_shutdown_callback_;
  70. std::set<std::unique_ptr<ResolveHostRequest>, base::UniquePtrComparator>
  71. requests_;
  72. std::set<std::unique_ptr<HostResolverMdnsListener>, base::UniquePtrComparator>
  73. listeners_;
  74. const raw_ptr<net::HostResolver> internal_resolver_;
  75. const raw_ptr<net::NetLog> net_log_;
  76. base::WeakPtrFactory<HostResolver> weak_factory_{this};
  77. };
  78. } // namespace network
  79. #endif // SERVICES_NETWORK_HOST_RESOLVER_H_