HttpTransactionParent.h (7770B)
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 #ifndef HttpTransactionParent_h__ 7 #define HttpTransactionParent_h__ 8 9 #include "mozilla/Atomics.h" 10 #include "mozilla/Mutex.h" 11 #include "mozilla/net/HttpTransactionShell.h" 12 #include "mozilla/net/NeckoChannelParams.h" 13 #include "mozilla/net/PHttpTransactionParent.h" 14 #include "nsCOMPtr.h" 15 #include "nsHttp.h" 16 #include "nsIRequest.h" 17 #include "nsIThreadRetargetableRequest.h" 18 #include "nsITransport.h" 19 #include "nsITransportSecurityInfo.h" 20 21 namespace mozilla::net { 22 23 class ChannelEventQueue; 24 class nsHttpConnectionInfo; 25 26 #define HTTP_TRANSACTION_PARENT_IID \ 27 {0xb83695cb, 0xc24b, 0x4c53, {0x85, 0x9b, 0x77, 0x77, 0x3e, 0xc5, 0x44, 0xe5}} 28 29 // HttpTransactionParent plays the role of nsHttpTransaction and delegates the 30 // work to the nsHttpTransaction in socket process. 31 class HttpTransactionParent final : public PHttpTransactionParent, 32 public HttpTransactionShell, 33 public nsIRequest, 34 public nsIThreadRetargetableRequest { 35 public: 36 NS_DECL_THREADSAFE_ISUPPORTS 37 NS_DECL_HTTPTRANSACTIONSHELL 38 NS_DECL_NSIREQUEST 39 NS_DECL_NSITHREADRETARGETABLEREQUEST 40 NS_INLINE_DECL_STATIC_IID(HTTP_TRANSACTION_PARENT_IID) 41 42 explicit HttpTransactionParent(bool aIsDocumentLoad); 43 44 void ActorDestroy(ActorDestroyReason aWhy) override; 45 46 mozilla::ipc::IPCResult RecvOnStartRequest( 47 const nsresult& aStatus, Maybe<nsHttpResponseHead>&& aResponseHead, 48 nsITransportSecurityInfo* aSecurityInfo, const bool& aProxyConnectFailed, 49 const TimingStructArgs& aTimings, 50 const int32_t& aProxyConnectResponseCode, 51 nsTArray<uint8_t>&& aDataForSniffer, const Maybe<nsCString>& aAltSvcUsed, 52 const bool& aDataToChildProcess, const bool& aRestarted, 53 const uint32_t& aHTTPSSVCReceivedStage, const bool& aSupportsHttp3, 54 const nsIRequest::TRRMode& aMode, const TRRSkippedReason& aSkipReason, 55 const uint32_t& aCaps, const TimeStamp& aOnStartRequestStartTime, 56 const HttpConnectionInfoCloneArgs& aArgs, 57 const nsILoadInfo::IPAddressSpace& aTargetIPAddressSpace); 58 mozilla::ipc::IPCResult RecvOnTransportStatus( 59 const nsresult& aStatus, const int64_t& aProgress, 60 const int64_t& aProgressMax, 61 Maybe<NetworkAddressArg>&& aNetworkAddressArg); 62 mozilla::ipc::IPCResult RecvOnDataAvailable( 63 const nsCString& aData, const uint64_t& aOffset, const uint32_t& aCount, 64 const TimeStamp& aOnDataAvailableStartTime); 65 mozilla::ipc::IPCResult RecvOnStopRequest( 66 const nsresult& aStatus, const bool& aResponseIsComplete, 67 const int64_t& aTransferSize, const TimingStructArgs& aTimings, 68 const Maybe<nsHttpHeaderArray>& responseTrailers, 69 Maybe<TransactionObserverResult>&& aTransactionObserverResult, 70 const TimeStamp& aLastActiveTabOptHit, 71 const TimeStamp& aOnStopRequestStartTime); 72 mozilla::ipc::IPCResult RecvOnInitFailed(const nsresult& aStatus); 73 mozilla::ipc::IPCResult RecvEarlyHint(const nsCString& aValue, 74 const nsACString& aReferrerPolicy, 75 const nsACString& aCSPHeader); 76 77 virtual mozilla::TimeStamp GetPendingTime() override; 78 79 already_AddRefed<nsIEventTarget> GetNeckoTarget(); 80 81 void SetSniffedTypeToChannel( 82 nsInputStreamPump::PeekSegmentFun aCallTypeSniffers, 83 nsIChannel* aChannel); 84 85 void SetRedirectTimestamp(TimeStamp aRedirectStart, TimeStamp aRedirectEnd) { 86 mRedirectStart = aRedirectStart; 87 mRedirectEnd = aRedirectEnd; 88 } 89 90 virtual TimeStamp GetOnStartRequestStartTime() const override { 91 return mOnStartRequestStartTime; 92 } 93 virtual TimeStamp GetDataAvailableStartTime() const override { 94 return mOnDataAvailableStartTime; 95 } 96 virtual TimeStamp GetOnStopRequestStartTime() const override { 97 return mOnStopRequestStartTime; 98 } 99 100 private: 101 virtual ~HttpTransactionParent(); 102 103 void GetStructFromInfo(nsHttpConnectionInfo* aInfo, 104 HttpConnectionInfoCloneArgs& aArgs); 105 void DoOnStartRequest( 106 const nsresult& aStatus, Maybe<nsHttpResponseHead>&& aResponseHead, 107 nsITransportSecurityInfo* aSecurityInfo, const bool& aProxyConnectFailed, 108 const TimingStructArgs& aTimings, 109 const int32_t& aProxyConnectResponseCode, 110 nsTArray<uint8_t>&& aDataForSniffer, const Maybe<nsCString>& aAltSvcUsed, 111 const bool& aDataToChildProcess, const bool& aRestarted, 112 const uint32_t& aHTTPSSVCReceivedStage, const bool& aSupportsHttp3, 113 const nsIRequest::TRRMode& aMode, const TRRSkippedReason& aSkipReason, 114 const uint32_t& aCaps, const TimeStamp& aOnStartRequestStartTime, 115 nsHttpConnectionInfo* aConnInfo, 116 const nsILoadInfo::IPAddressSpace& aTargetIPAddressSpace); 117 void DoOnDataAvailable(const nsCString& aData, const uint64_t& aOffset, 118 const uint32_t& aCount, 119 const TimeStamp& aOnDataAvailableStartTime); 120 void DoOnStopRequest( 121 const nsresult& aStatus, const bool& aResponseIsComplete, 122 const int64_t& aTransferSize, const TimingStructArgs& aTimings, 123 const Maybe<nsHttpHeaderArray>& responseTrailers, 124 Maybe<TransactionObserverResult>&& aTransactionObserverResult, 125 const TimeStamp& aOnStopRequestStartTime); 126 void DoNotifyListener(); 127 void ContinueDoNotifyListener(); 128 // Get event target for ODA. 129 already_AddRefed<nsISerialEventTarget> GetODATarget(); 130 void CancelOnMainThread(nsresult aRv); 131 void HandleAsyncAbort(); 132 133 nsCOMPtr<nsITransportEventSink> mEventsink; 134 nsCOMPtr<nsIStreamListener> mChannel; 135 nsCOMPtr<nsISerialEventTarget> mTargetThread; 136 nsCOMPtr<nsISerialEventTarget> mODATarget; 137 Mutex mEventTargetMutex MOZ_UNANNOTATED{ 138 "HttpTransactionParent::EventTargetMutex"}; 139 nsCOMPtr<nsITransportSecurityInfo> mSecurityInfo; 140 UniquePtr<nsHttpResponseHead> mResponseHead; 141 UniquePtr<nsHttpHeaderArray> mResponseTrailers; 142 RefPtr<ChannelEventQueue> mEventQ; 143 144 bool mResponseIsComplete{false}; 145 int64_t mTransferSize{0}; 146 int64_t mRequestSize{0}; 147 bool mIsHttp3Used = false; 148 bool mProxyConnectFailed{false}; 149 Atomic<bool, ReleaseAcquire> mCanceled{false}; 150 Atomic<nsresult, ReleaseAcquire> mStatus{NS_OK}; 151 int32_t mSuspendCount{0}; 152 bool mResponseHeadTaken{false}; 153 bool mResponseTrailersTaken{false}; 154 bool mOnStartRequestCalled{false}; 155 bool mOnStopRequestCalled{false}; 156 bool mResolvedByTRR{false}; 157 nsIRequest::TRRMode mEffectiveTRRMode{nsIRequest::TRR_DEFAULT_MODE}; 158 TRRSkippedReason mTRRSkipReason{nsITRRSkipReason::TRR_UNSET}; 159 bool mEchConfigUsed = false; 160 int32_t mProxyConnectResponseCode{0}; 161 uint64_t mChannelId{0}; 162 bool mDataSentToChildProcess{false}; 163 bool mIsDocumentLoad; 164 bool mRestarted{false}; 165 Atomic<uint32_t, ReleaseAcquire> mCaps{0}; 166 TimeStamp mRedirectStart; 167 TimeStamp mRedirectEnd; 168 169 NetAddr mSelfAddr; 170 NetAddr mPeerAddr; 171 nsILoadInfo::IPAddressSpace mTargetIPAddressSpace{ 172 nsILoadInfo::IPAddressSpace::Unknown}; 173 TimingStruct mTimings; 174 TimeStamp mDomainLookupStart; 175 TimeStamp mDomainLookupEnd; 176 TimeStamp mOnStartRequestStartTime; 177 TimeStamp mOnDataAvailableStartTime; 178 TimeStamp mOnStopRequestStartTime; 179 TransactionObserverFunc mTransactionObserver; 180 nsTArray<uint8_t> mDataForSniffer; 181 std::function<void()> mCallOnResume; 182 uint32_t mHTTPSSVCReceivedStage{}; 183 RefPtr<nsHttpConnectionInfo> mConnInfo; 184 bool mSupportsHTTP3 = false; 185 }; 186 187 } // namespace mozilla::net 188 189 #endif // nsHttpTransactionParent_h__