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