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