tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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__