1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set sw=2 ts=8 et tw=80 : */
3 
4 /* This Source Code Form is subject to the terms of the Mozilla Public
5  * License, v. 2.0. If a copy of the MPL was not distributed with this
6  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 
8 #ifndef mozilla_net_TRRServiceChannel_h
9 #define mozilla_net_TRRServiceChannel_h
10 
11 #include "HttpBaseChannel.h"
12 #include "mozilla/DataMutex.h"
13 #include "nsIDNSListener.h"
14 #include "nsIProtocolProxyCallback.h"
15 #include "nsIProxiedChannel.h"
16 #include "nsIStreamListener.h"
17 #include "nsWeakReference.h"
18 
19 class nsDNSPrefetch;
20 
21 namespace mozilla {
22 namespace net {
23 
24 class HttpTransactionShell;
25 class nsHttpHandler;
26 
27 // Use to support QI nsIChannel to TRRServiceChannel
28 #define NS_TRRSERVICECHANNEL_IID                     \
29   {                                                  \
30     0x361c4bb1, 0xd6b2, 0x493b, {                    \
31       0x86, 0xbc, 0x88, 0xd3, 0x5d, 0x16, 0x38, 0xfa \
32     }                                                \
33   }
34 
35 // TRRServiceChannel is designed to fetch DNS data from DoH server. This channel
36 // MUST only be used by TRR.
37 class TRRServiceChannel : public HttpBaseChannel,
38                           public HttpAsyncAborter<TRRServiceChannel>,
39                           public nsIDNSListener,
40                           public nsIStreamListener,
41                           public nsITransportEventSink,
42                           public nsIProxiedChannel,
43                           public nsIProtocolProxyCallback,
44                           public nsSupportsWeakReference {
45  public:
46   NS_DECL_ISUPPORTS_INHERITED
47   NS_DECL_NSIDNSLISTENER
48   NS_DECL_NSIREQUESTOBSERVER
49   NS_DECL_NSISTREAMLISTENER
50   NS_DECL_NSITRANSPORTEVENTSINK
51   NS_DECL_NSIPROXIEDCHANNEL
52   NS_DECL_NSIPROTOCOLPROXYCALLBACK
53   NS_DECLARE_STATIC_IID_ACCESSOR(NS_TRRSERVICECHANNEL_IID)
54 
55   // nsIRequest
56   NS_IMETHOD Cancel(nsresult status) override;
57   NS_IMETHOD Suspend() override;
58   NS_IMETHOD Resume() override;
59   NS_IMETHOD GetLoadFlags(nsLoadFlags* aLoadFlags) override;
60   NS_IMETHOD SetLoadFlags(nsLoadFlags aLoadFlags) override;
61   NS_IMETHOD GetURI(nsIURI** aURI) override;
62   NS_IMETHOD GetNotificationCallbacks(
63       nsIInterfaceRequestor** aCallbacks) override;
64   NS_IMETHOD GetLoadGroup(nsILoadGroup** aLoadGroup) override;
65   NS_IMETHOD GetRequestMethod(nsACString& aMethod) override;
66   // nsIChannel
67   NS_IMETHOD GetSecurityInfo(nsISupports** aSecurityInfo) override;
68   NS_IMETHOD AsyncOpen(nsIStreamListener* aListener) override;
69 
70   NS_IMETHOD LogBlockedCORSRequest(const nsAString& aMessage,
71                                    const nsACString& aCategory) override;
72   NS_IMETHOD LogMimeTypeMismatch(const nsACString& aMessageName, bool aWarning,
73                                  const nsAString& aURL,
74                                  const nsAString& aContentType) override;
75   NS_IMETHOD GetIsAuthChannel(bool* aIsAuthChannel) override;
76 
77   NS_IMETHOD SetNotificationCallbacks(
78       nsIInterfaceRequestor* aCallbacks) override;
79   // nsISupportsPriority
80   NS_IMETHOD SetPriority(int32_t value) override;
81   // nsIClassOfService
82   NS_IMETHOD SetClassFlags(uint32_t inFlags) override;
83   NS_IMETHOD AddClassFlags(uint32_t inFlags) override;
84   NS_IMETHOD ClearClassFlags(uint32_t inFlags) override;
85   // nsIResumableChannel
86   NS_IMETHOD ResumeAt(uint64_t startPos, const nsACString& entityID) override;
87 
88   [[nodiscard]] nsresult OnPush(uint32_t aPushedStreamId,
89                                 const nsACString& aUrl,
90                                 const nsACString& aRequestString,
91                                 HttpTransactionShell* aTransaction);
92   void SetPushedStreamTransactionAndId(
93       HttpTransactionShell* aTransWithPushedStream, uint32_t aPushedStreamId);
94 
95   // nsITimedChannel
96   NS_IMETHOD GetDomainLookupStart(
97       mozilla::TimeStamp* aDomainLookupStart) override;
98   NS_IMETHOD GetDomainLookupEnd(mozilla::TimeStamp* aDomainLookupEnd) override;
99   NS_IMETHOD GetConnectStart(mozilla::TimeStamp* aConnectStart) override;
100   NS_IMETHOD GetTcpConnectEnd(mozilla::TimeStamp* aTcpConnectEnd) override;
101   NS_IMETHOD GetSecureConnectionStart(
102       mozilla::TimeStamp* aSecureConnectionStart) override;
103   NS_IMETHOD GetConnectEnd(mozilla::TimeStamp* aConnectEnd) override;
104   NS_IMETHOD GetRequestStart(mozilla::TimeStamp* aRequestStart) override;
105   NS_IMETHOD GetResponseStart(mozilla::TimeStamp* aResponseStart) override;
106   NS_IMETHOD GetResponseEnd(mozilla::TimeStamp* aResponseEnd) override;
107   NS_IMETHOD SetLoadGroup(nsILoadGroup* aLoadGroup) override;
108   NS_IMETHOD TimingAllowCheck(nsIPrincipal* aOrigin, bool* aResult) override;
109 
110  protected:
111   TRRServiceChannel();
112   virtual ~TRRServiceChannel();
113 
114   void CancelNetworkRequest(nsresult aStatus);
115   nsresult BeginConnect();
116   nsresult ContinueOnBeforeConnect();
117   nsresult Connect();
118   nsresult SetupTransaction();
119   void OnClassOfServiceUpdated();
120   virtual void DoNotifyListenerCleanup() override;
121   virtual void DoAsyncAbort(nsresult aStatus) override;
IsIsolated()122   bool IsIsolated() { return false; };
123   void ProcessAltService();
124   nsresult CallOnStartRequest();
125 
126   void MaybeStartDNSPrefetch();
127   void DoNotifyListener();
128   nsresult MaybeResolveProxyAndBeginConnect();
129   nsresult ResolveProxy();
130   void AfterApplyContentConversions(nsresult aResult,
131                                     nsIStreamListener* aListener);
132   nsresult SyncProcessRedirection(uint32_t aHttpStatus);
133   [[nodiscard]] virtual nsresult SetupReplacementChannel(
134       nsIURI* aNewURI, nsIChannel* aNewChannel, bool aPreserveMethod,
135       uint32_t aRedirectFlags) override;
136 
137   virtual bool SameOriginWithOriginalUri(nsIURI* aURI) override;
138   bool DispatchRelease();
139 
140   nsCString mUsername;
141 
142   // Needed for accurate DNS timing
143   RefPtr<nsDNSPrefetch> mDNSPrefetch;
144 
145   nsCOMPtr<nsIRequest> mTransactionPump;
146   RefPtr<HttpTransactionShell> mTransaction;
147   uint32_t mPushedStreamId{0};
148   RefPtr<HttpTransactionShell> mTransWithPushedStream;
149   DataMutex<nsCOMPtr<nsICancelable>> mProxyRequest;
150   nsCOMPtr<nsIEventTarget> mCurrentEventTarget;
151 
152   friend class HttpAsyncAborter<TRRServiceChannel>;
153   friend class nsHttpHandler;
154 };
155 
156 NS_DEFINE_STATIC_IID_ACCESSOR(TRRServiceChannel, NS_TRRSERVICECHANNEL_IID)
157 
158 }  // namespace net
159 }  // namespace mozilla
160 
161 #endif  // mozilla_net_TRRServiceChannel_h
162