diff options
Diffstat (limited to 'netwerk/protocol/http/HttpTransactionParent.h')
-rw-r--r-- | netwerk/protocol/http/HttpTransactionParent.h | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/netwerk/protocol/http/HttpTransactionParent.h b/netwerk/protocol/http/HttpTransactionParent.h new file mode 100644 index 0000000000..e6e74ebf97 --- /dev/null +++ b/netwerk/protocol/http/HttpTransactionParent.h @@ -0,0 +1,197 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* 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 HttpTransactionParent_h__ +#define HttpTransactionParent_h__ + +#include "mozilla/Atomics.h" +#include "mozilla/Mutex.h" +#include "mozilla/net/HttpTransactionShell.h" +#include "mozilla/net/NeckoChannelParams.h" +#include "mozilla/net/PHttpTransactionParent.h" +#include "nsCOMPtr.h" +#include "nsHttp.h" +#include "nsIRequest.h" +#include "nsIThreadRetargetableRequest.h" +#include "nsITransport.h" +#include "nsITransportSecurityInfo.h" + +namespace mozilla::net { + +class ChannelEventQueue; +class nsHttpConnectionInfo; + +#define HTTP_TRANSACTION_PARENT_IID \ + { \ + 0xb83695cb, 0xc24b, 0x4c53, { \ + 0x85, 0x9b, 0x77, 0x77, 0x3e, 0xc5, 0x44, 0xe5 \ + } \ + } + +// HttpTransactionParent plays the role of nsHttpTransaction and delegates the +// work to the nsHttpTransaction in socket process. +class HttpTransactionParent final : public PHttpTransactionParent, + public HttpTransactionShell, + public nsIRequest, + public nsIThreadRetargetableRequest { + public: + NS_DECL_THREADSAFE_ISUPPORTS + NS_DECL_HTTPTRANSACTIONSHELL + NS_DECL_NSIREQUEST + NS_DECL_NSITHREADRETARGETABLEREQUEST + NS_DECLARE_STATIC_IID_ACCESSOR(HTTP_TRANSACTION_PARENT_IID) + + explicit HttpTransactionParent(bool aIsDocumentLoad); + + void ActorDestroy(ActorDestroyReason aWhy) override; + + mozilla::ipc::IPCResult RecvOnStartRequest( + const nsresult& aStatus, const Maybe<nsHttpResponseHead>& aResponseHead, + nsITransportSecurityInfo* aSecurityInfo, const bool& aProxyConnectFailed, + const TimingStructArgs& aTimings, + const int32_t& aProxyConnectResponseCode, + nsTArray<uint8_t>&& aDataForSniffer, const Maybe<nsCString>& aAltSvcUsed, + const bool& aDataToChildProcess, const bool& aRestarted, + const uint32_t& aHTTPSSVCReceivedStage, const bool& aSupportsHttp3, + const nsIRequest::TRRMode& aMode, const TRRSkippedReason& aSkipReason, + const uint32_t& aCaps, const TimeStamp& aOnStartRequestStartTime); + mozilla::ipc::IPCResult RecvOnTransportStatus( + const nsresult& aStatus, const int64_t& aProgress, + const int64_t& aProgressMax, + Maybe<NetworkAddressArg>&& aNetworkAddressArg); + mozilla::ipc::IPCResult RecvOnDataAvailable( + const nsCString& aData, const uint64_t& aOffset, const uint32_t& aCount, + const TimeStamp& aOnDataAvailableStartTime); + mozilla::ipc::IPCResult RecvOnStopRequest( + const nsresult& aStatus, const bool& aResponseIsComplete, + const int64_t& aTransferSize, const TimingStructArgs& aTimings, + const Maybe<nsHttpHeaderArray>& responseTrailers, + Maybe<TransactionObserverResult>&& aTransactionObserverResult, + const TimeStamp& aLastActiveTabOptHit, + const HttpConnectionInfoCloneArgs& aArgs, + const TimeStamp& aOnStopRequestStartTime); + mozilla::ipc::IPCResult RecvOnInitFailed(const nsresult& aStatus); + + mozilla::ipc::IPCResult RecvOnH2PushStream(const uint32_t& aPushedStreamId, + const nsCString& aResourceUrl, + const nsCString& aRequestString); + mozilla::ipc::IPCResult RecvEarlyHint(const nsCString& aValue, + const nsACString& aReferrerPolicy, + const nsACString& aCSPHeader); + + virtual mozilla::TimeStamp GetPendingTime() override; + + already_AddRefed<nsIEventTarget> GetNeckoTarget(); + + void SetSniffedTypeToChannel( + nsInputStreamPump::PeekSegmentFun aCallTypeSniffers, + nsIChannel* aChannel); + + void SetRedirectTimestamp(TimeStamp aRedirectStart, TimeStamp aRedirectEnd) { + mRedirectStart = aRedirectStart; + mRedirectEnd = aRedirectEnd; + } + + virtual TimeStamp GetOnStartRequestStartTime() const override { + return mOnStartRequestStartTime; + } + virtual TimeStamp GetDataAvailableStartTime() const override { + return mOnDataAvailableStartTime; + } + virtual TimeStamp GetOnStopRequestStartTime() const override { + return mOnStopRequestStartTime; + } + + private: + virtual ~HttpTransactionParent(); + + void GetStructFromInfo(nsHttpConnectionInfo* aInfo, + HttpConnectionInfoCloneArgs& aArgs); + void DoOnStartRequest( + const nsresult& aStatus, const Maybe<nsHttpResponseHead>& aResponseHead, + nsITransportSecurityInfo* aSecurityInfo, const bool& aProxyConnectFailed, + const TimingStructArgs& aTimings, + const int32_t& aProxyConnectResponseCode, + nsTArray<uint8_t>&& aDataForSniffer, const Maybe<nsCString>& aAltSvcUsed, + const bool& aDataToChildProcess, const bool& aRestarted, + const uint32_t& aHTTPSSVCReceivedStage, const bool& aSupportsHttp3, + const nsIRequest::TRRMode& aMode, const TRRSkippedReason& aSkipReason, + const uint32_t& aCaps, const TimeStamp& aOnStartRequestStartTime); + void DoOnDataAvailable(const nsCString& aData, const uint64_t& aOffset, + const uint32_t& aCount, + const TimeStamp& aOnDataAvailableStartTime); + void DoOnStopRequest( + const nsresult& aStatus, const bool& aResponseIsComplete, + const int64_t& aTransferSize, const TimingStructArgs& aTimings, + const Maybe<nsHttpHeaderArray>& responseTrailers, + Maybe<TransactionObserverResult>&& aTransactionObserverResult, + nsHttpConnectionInfo* aConnInfo, + const TimeStamp& aOnStopRequestStartTime); + void DoNotifyListener(); + void ContinueDoNotifyListener(); + // Get event target for ODA. + already_AddRefed<nsISerialEventTarget> GetODATarget(); + void CancelOnMainThread(nsresult aRv); + void HandleAsyncAbort(); + + nsCOMPtr<nsITransportEventSink> mEventsink; + nsCOMPtr<nsIStreamListener> mChannel; + nsCOMPtr<nsISerialEventTarget> mTargetThread; + nsCOMPtr<nsISerialEventTarget> mODATarget; + Mutex mEventTargetMutex MOZ_UNANNOTATED{ + "HttpTransactionParent::EventTargetMutex"}; + nsCOMPtr<nsITransportSecurityInfo> mSecurityInfo; + UniquePtr<nsHttpResponseHead> mResponseHead; + UniquePtr<nsHttpHeaderArray> mResponseTrailers; + RefPtr<ChannelEventQueue> mEventQ; + + bool mResponseIsComplete{false}; + int64_t mTransferSize{0}; + int64_t mRequestSize{0}; + bool mIsHttp3Used = false; + bool mProxyConnectFailed{false}; + Atomic<bool, ReleaseAcquire> mCanceled{false}; + Atomic<nsresult, ReleaseAcquire> mStatus{NS_OK}; + int32_t mSuspendCount{0}; + bool mResponseHeadTaken{false}; + bool mResponseTrailersTaken{false}; + bool mOnStartRequestCalled{false}; + bool mOnStopRequestCalled{false}; + bool mResolvedByTRR{false}; + nsIRequest::TRRMode mEffectiveTRRMode{nsIRequest::TRR_DEFAULT_MODE}; + TRRSkippedReason mTRRSkipReason{nsITRRSkipReason::TRR_UNSET}; + bool mEchConfigUsed = false; + int32_t mProxyConnectResponseCode{0}; + uint64_t mChannelId{0}; + bool mDataSentToChildProcess{false}; + bool mIsDocumentLoad; + bool mRestarted{false}; + Atomic<uint32_t, ReleaseAcquire> mCaps{0}; + TimeStamp mRedirectStart; + TimeStamp mRedirectEnd; + + NetAddr mSelfAddr; + NetAddr mPeerAddr; + TimingStruct mTimings; + TimeStamp mDomainLookupStart; + TimeStamp mDomainLookupEnd; + TimeStamp mOnStartRequestStartTime; + TimeStamp mOnDataAvailableStartTime; + TimeStamp mOnStopRequestStartTime; + TransactionObserverFunc mTransactionObserver; + OnPushCallback mOnPushCallback; + nsTArray<uint8_t> mDataForSniffer; + std::function<void()> mCallOnResume; + uint32_t mHTTPSSVCReceivedStage{}; + RefPtr<nsHttpConnectionInfo> mConnInfo; + bool mSupportsHTTP3 = false; +}; + +NS_DEFINE_STATIC_IID_ACCESSOR(HttpTransactionParent, + HTTP_TRANSACTION_PARENT_IID) + +} // namespace mozilla::net + +#endif // nsHttpTransactionParent_h__ |