HttpTransactionChild.h (5235B)
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 HttpTransactionChild_h__ 7 #define HttpTransactionChild_h__ 8 9 #include "mozilla/Atomics.h" 10 #include "mozilla/net/NeckoChannelParams.h" 11 #include "mozilla/net/PHttpTransactionChild.h" 12 #include "nsHttpRequestHead.h" 13 #include "nsIEarlyHintObserver.h" 14 #include "nsIRequest.h" 15 #include "nsIStreamListener.h" 16 #include "nsIThreadRetargetableStreamListener.h" 17 #include "nsIThrottledInputChannel.h" 18 #include "nsITransport.h" 19 20 class nsInputStreamPump; 21 22 namespace mozilla::net { 23 24 class BackgroundDataBridgeParent; 25 class InputChannelThrottleQueueChild; 26 class nsHttpConnectionInfo; 27 class nsHttpTransaction; 28 class nsProxyInfo; 29 30 //----------------------------------------------------------------------------- 31 // HttpTransactionChild commutes between parent process and socket process, 32 // manages the real nsHttpTransaction and transaction pump. 33 //----------------------------------------------------------------------------- 34 class HttpTransactionChild final : public PHttpTransactionChild, 35 public nsITransportEventSink, 36 public nsIThrottledInputChannel, 37 public nsIThreadRetargetableStreamListener, 38 public nsIEarlyHintObserver { 39 public: 40 NS_DECL_THREADSAFE_ISUPPORTS 41 NS_DECL_NSIREQUESTOBSERVER 42 NS_DECL_NSISTREAMLISTENER 43 NS_DECL_NSITRANSPORTEVENTSINK 44 NS_DECL_NSITHROTTLEDINPUTCHANNEL 45 NS_DECL_NSITHREADRETARGETABLESTREAMLISTENER 46 NS_DECL_NSIEARLYHINTOBSERVER 47 48 explicit HttpTransactionChild(); 49 50 mozilla::ipc::IPCResult RecvInit( 51 const uint32_t& aCaps, const HttpConnectionInfoCloneArgs& aArgs, 52 const nsHttpRequestHead& aReqHeaders, 53 const Maybe<IPCStream>& aRequestBody, const uint64_t& aReqContentLength, 54 const bool& aReqBodyIncludesHeaders, 55 const uint64_t& aTopLevelOuterContentWindowId, 56 const uint8_t& aHttpTrafficCategory, const uint64_t& aRequestContextID, 57 const ClassOfService& aClassOfService, const uint32_t& aInitialRwin, 58 const bool& aResponseTimeoutEnabled, const uint64_t& aChannelId, 59 const bool& aHasTransactionObserver, 60 const mozilla::Maybe<PInputChannelThrottleQueueChild*>& aThrottleQueue, 61 const bool& aIsDocumentLoad, 62 const nsILoadInfo::IPAddressSpace& aParentIPAddressSpace, 63 const LNAPerms& aLnaPermissionStatus, const TimeStamp& aRedirectStart, 64 const TimeStamp& aRedirectEnd); 65 66 mozilla::ipc::IPCResult RecvCancelPump(const nsresult& aStatus); 67 mozilla::ipc::IPCResult RecvSuspendPump(); 68 mozilla::ipc::IPCResult RecvResumePump(); 69 mozilla::ipc::IPCResult RecvSetDNSWasRefreshed(); 70 mozilla::ipc::IPCResult RecvDontReuseConnection(); 71 mozilla::ipc::IPCResult RecvSetH2WSConnRefTaken(); 72 void ActorDestroy(ActorDestroyReason aWhy) override; 73 74 nsHttpTransaction* GetHttpTransaction(); 75 76 private: 77 virtual ~HttpTransactionChild(); 78 79 nsProxyInfo* ProxyInfoCloneArgsToProxyInfo( 80 const nsTArray<ProxyInfoCloneArgs>& aArgs); 81 already_AddRefed<nsHttpConnectionInfo> DeserializeHttpConnectionInfoCloneArgs( 82 const HttpConnectionInfoCloneArgs& aInfoArgs); 83 // Initialize the *real* nsHttpTransaction. See |nsHttpTransaction::Init| 84 // for the parameters. 85 [[nodiscard]] nsresult InitInternal( 86 uint32_t caps, const HttpConnectionInfoCloneArgs& infoArgs, 87 nsHttpRequestHead* requestHead, 88 nsIInputStream* requestBody, // use the trick in bug 1277681 89 uint64_t requestContentLength, bool requestBodyHasHeaders, 90 uint64_t topLevelOuterContentWindowId, uint8_t httpTrafficCategory, 91 uint64_t requestContextID, ClassOfService classOfService, 92 uint32_t initialRwin, bool responseTimeoutEnabled, uint64_t channelId, 93 bool aHasTransactionObserver, 94 const nsILoadInfo::IPAddressSpace& aParentIPAddressSpace, 95 const LNAPerms& aLnaPermissionStatus); 96 97 void CancelInternal(nsresult aStatus); 98 99 bool CanSendODAToContentProcessDirectly( 100 const Maybe<nsHttpResponseHead>& aHead); 101 102 ResourceTimingStructArgs GetTimingAttributes(); 103 104 // Use Release-Acquire ordering to ensure the OMT ODA is ignored while 105 // transaction is canceled on main thread. 106 Atomic<bool, ReleaseAcquire> mCanceled{false}; 107 Atomic<nsresult, ReleaseAcquire> mStatus{NS_OK}; 108 uint64_t mChannelId{0}; 109 nsHttpRequestHead mRequestHead; 110 bool mIsDocumentLoad{false}; 111 uint64_t mLogicalOffset{0}; 112 TimeStamp mRedirectStart; 113 TimeStamp mRedirectEnd; 114 nsCString mProtocolVersion; 115 116 nsCOMPtr<nsIInputStream> mUploadStream; 117 RefPtr<nsHttpTransaction> mTransaction; 118 nsCOMPtr<nsIRequest> mTransactionPump; 119 Maybe<TransactionObserverResult> mTransactionObserverResult; 120 RefPtr<InputChannelThrottleQueueChild> mThrottleQueue; 121 RefPtr<BackgroundDataBridgeParent> mDataBridgeParent; 122 }; 123 124 } // namespace mozilla::net 125 126 inline nsISupports* ToSupports(mozilla::net::HttpTransactionChild* p) { 127 return static_cast<nsIStreamListener*>(p); 128 } 129 130 #endif // nsHttpTransactionChild_h__