summaryrefslogtreecommitdiffstats
path: root/netwerk/dns/TRRServiceBase.h
blob: b022f61883ecbbd07cc2799ba17eb653454543cd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef TRRServiceBase_h_
#define TRRServiceBase_h_

#include "mozilla/Atomics.h"
#include "mozilla/DataMutex.h"
#include "mozilla/net/rust_helper.h"
#include "nsString.h"
#include "nsIDNSService.h"
#include "nsIProtocolProxyService2.h"

class nsICancelable;
class nsIProxyInfo;

namespace mozilla {
namespace net {

class nsHttpConnectionInfo;

static const char kRolloutURIPref[] = "doh-rollout.uri";
static const char kRolloutModePref[] = "doh-rollout.mode";

class TRRServiceBase : public nsIProxyConfigChangedCallback {
 public:
  NS_DECL_THREADSAFE_ISUPPORTS

  TRRServiceBase();
  nsIDNSService::ResolverMode Mode() { return mMode; }
  virtual void GetURI(nsACString& result) = 0;
  already_AddRefed<nsHttpConnectionInfo> TRRConnectionInfo();
  // Called to initialize the connection info. Once the connection info is
  // created first time, mTRRConnectionInfoInited will be set to true.
  virtual void InitTRRConnectionInfo();
  bool TRRConnectionInfoInited() const { return mTRRConnectionInfoInited; }

 protected:
  virtual ~TRRServiceBase();

  virtual bool MaybeSetPrivateURI(const nsACString& aURI) = 0;
  void ProcessURITemplate(nsACString& aURI);
  // Checks the network.trr.uri or the doh-rollout.uri prefs and sets the URI
  // in order of preference:
  // 1. The value of network.trr.uri if it is not the default one, meaning
  //    is was set by an explicit user action
  // 2. The value of doh-rollout.uri if it exists
  //    this is set by the rollout addon
  // 3. The default value of network.trr.uri
  void CheckURIPrefs();

  void OnTRRModeChange();
  void OnTRRURIChange();

  void DoReadEtcHostsFile(ParsingCallback aCallback);
  virtual void ReadEtcHostsFile() = 0;
  // Called to create a connection info that will be used by TRRServiceChannel.
  // Note that when this function is called, mDefaultTRRConnectionInfo will be
  // set to null to invalidate the connection info.
  // When the connection info is created, SetDefaultTRRConnectionInfo() is
  // called to set the result to mDefaultTRRConnectionInfo.
  // Note that this method does nothing when mTRRConnectionInfoInited is false.
  // We want to starting updating the connection info after it's create first
  // time.
  void AsyncCreateTRRConnectionInfo(const nsACString& aURI);
  void AsyncCreateTRRConnectionInfoInternal(const nsACString& aURI);
  virtual void SetDefaultTRRConnectionInfo(nsHttpConnectionInfo* aConnInfo);
  void RegisterProxyChangeListener();
  void UnregisterProxyChangeListener();

  nsCString mPrivateURI;  // protected by mMutex
  // Pref caches should only be used on the main thread.
  nsCString mURIPref;
  nsCString mRolloutURIPref;
  nsCString mDefaultURIPref;

  Atomic<nsIDNSService::ResolverMode, Relaxed> mMode{
      nsIDNSService::MODE_NATIVEONLY};
  Atomic<bool, Relaxed> mURISetByDetection{false};
  Atomic<bool, Relaxed> mTRRConnectionInfoInited{false};
  DataMutex<RefPtr<nsHttpConnectionInfo>> mDefaultTRRConnectionInfo;
};

}  // namespace net
}  // namespace mozilla

#endif  // TRRServiceBase_h_