forked from mirrors/gecko-dev
The diversion mechanism never expected to be dealing with data sourced from the content process, but that's exactly what happens with ServiceWorker-intercepted channels with the current child-intercept situation (which is being fixed). In order to allow timely cancellation of diverted intercepted channels, there needs to be a way to relay to the HttpChannelChild that it needs to be canceled so that the synthesized pump can be canceled and diversion can be marked as complete. This patch adds such a mechanism to ADivertableParentChannel and PHttpChannel for the exclusive use of InterceptedHttpChannel and then uses it. --HG-- extra : rebase_source : db71e927bd1837c6a67f6d56df52cfbb7294df73 extra : source : d156f6b687e1cd8717bf813ab1b944e87b67ed5d
148 lines
5.1 KiB
C++
148 lines
5.1 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set sw=2 ts=8 et tw=80 : */
|
|
|
|
/* 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 mozilla_net_FTPChannelParent_h
|
|
#define mozilla_net_FTPChannelParent_h
|
|
|
|
#include "ADivertableParentChannel.h"
|
|
#include "mozilla/net/PFTPChannelParent.h"
|
|
#include "mozilla/net/NeckoParent.h"
|
|
#include "nsIParentChannel.h"
|
|
#include "nsIInterfaceRequestor.h"
|
|
#include "nsIChannelEventSink.h"
|
|
#include "nsIFTPChannelParentInternal.h"
|
|
|
|
class nsILoadContext;
|
|
|
|
namespace mozilla {
|
|
|
|
namespace dom {
|
|
class TabParent;
|
|
class PBrowserOrId;
|
|
} // namespace dom
|
|
|
|
namespace net {
|
|
class ChannelEventQueue;
|
|
|
|
class FTPChannelParent final : public PFTPChannelParent
|
|
, public nsIParentChannel
|
|
, public nsIInterfaceRequestor
|
|
, public ADivertableParentChannel
|
|
, public nsIChannelEventSink
|
|
, public nsIFTPChannelParentInternal
|
|
{
|
|
public:
|
|
NS_DECL_ISUPPORTS
|
|
NS_DECL_NSIREQUESTOBSERVER
|
|
NS_DECL_NSISTREAMLISTENER
|
|
NS_DECL_NSIPARENTCHANNEL
|
|
NS_DECL_NSIINTERFACEREQUESTOR
|
|
NS_DECL_NSICHANNELEVENTSINK
|
|
|
|
FTPChannelParent(const dom::PBrowserOrId& aIframeEmbedding,
|
|
nsILoadContext* aLoadContext,
|
|
PBOverrideStatus aOverrideStatus);
|
|
|
|
bool Init(const FTPChannelCreationArgs& aOpenArgs);
|
|
|
|
// ADivertableParentChannel functions.
|
|
void DivertTo(nsIStreamListener *aListener) override;
|
|
nsresult SuspendForDiversion() override;
|
|
nsresult SuspendMessageDiversion() override;
|
|
nsresult ResumeMessageDiversion() override;
|
|
nsresult CancelDiversion() override;
|
|
|
|
|
|
// Calls OnStartRequest for "DivertTo" listener, then notifies child channel
|
|
// that it should divert OnDataAvailable and OnStopRequest calls to this
|
|
// parent channel.
|
|
void StartDiversion();
|
|
|
|
// Handles calling OnStart/Stop if there are errors during diversion.
|
|
// Called asynchronously from FailDiversion.
|
|
void NotifyDiversionFailed(nsresult aErrorCode, bool aSkipResume = true);
|
|
|
|
NS_IMETHOD SetErrorMsg(const char *aMsg, bool aUseUTF8) override;
|
|
|
|
protected:
|
|
virtual ~FTPChannelParent();
|
|
|
|
// private, supporting function for ADivertableParentChannel.
|
|
nsresult ResumeForDiversion();
|
|
|
|
// Asynchronously calls NotifyDiversionFailed.
|
|
void FailDiversion(nsresult aErrorCode, bool aSkipResume = true);
|
|
|
|
bool DoAsyncOpen(const URIParams& aURI, const uint64_t& aStartPos,
|
|
const nsCString& aEntityID,
|
|
const OptionalIPCStream& aUploadStream,
|
|
const OptionalLoadInfoArgs& aLoadInfoArgs);
|
|
|
|
// used to connect redirected-to channel in parent with just created
|
|
// ChildChannel. Used during HTTP->FTP redirects.
|
|
bool ConnectChannel(const uint32_t& channelId);
|
|
|
|
void DivertOnDataAvailable(const nsCString& data,
|
|
const uint64_t& offset,
|
|
const uint32_t& count);
|
|
void DivertOnStopRequest(const nsresult& statusCode);
|
|
void DivertComplete();
|
|
|
|
friend class FTPDivertDataAvailableEvent;
|
|
friend class FTPDivertStopRequestEvent;
|
|
friend class FTPDivertCompleteEvent;
|
|
|
|
virtual mozilla::ipc::IPCResult RecvCancel(const nsresult& status) override;
|
|
virtual mozilla::ipc::IPCResult RecvSuspend() override;
|
|
virtual mozilla::ipc::IPCResult RecvResume() override;
|
|
virtual mozilla::ipc::IPCResult RecvDivertOnDataAvailable(const nsCString& data,
|
|
const uint64_t& offset,
|
|
const uint32_t& count) override;
|
|
virtual mozilla::ipc::IPCResult RecvDivertOnStopRequest(const nsresult& statusCode) override;
|
|
virtual mozilla::ipc::IPCResult RecvDivertComplete() override;
|
|
|
|
nsresult SuspendChannel();
|
|
nsresult ResumeChannel();
|
|
|
|
virtual void ActorDestroy(ActorDestroyReason why) override;
|
|
|
|
// if configured to use HTTP proxy for FTP, this can an an HTTP channel.
|
|
nsCOMPtr<nsIChannel> mChannel;
|
|
|
|
bool mIPCClosed;
|
|
|
|
nsCOMPtr<nsILoadContext> mLoadContext;
|
|
|
|
PBOverrideStatus mPBOverride;
|
|
|
|
// If OnStart/OnData/OnStop have been diverted from the child, forward them to
|
|
// this listener.
|
|
nsCOMPtr<nsIStreamListener> mDivertToListener;
|
|
// Set to the canceled status value if the main channel was canceled.
|
|
nsresult mStatus;
|
|
// Once set, no OnStart/OnData/OnStop calls should be accepted; conversely, it
|
|
// must be set when RecvDivertOnData/~DivertOnStop/~DivertComplete are
|
|
// received from the child channel.
|
|
bool mDivertingFromChild;
|
|
// Set if OnStart|StopRequest was called during a diversion from the child.
|
|
bool mDivertedOnStartRequest;
|
|
|
|
// Set if we successfully suspended the nsHttpChannel for diversion. Unset
|
|
// when we call ResumeForDiversion.
|
|
bool mSuspendedForDiversion;
|
|
RefPtr<mozilla::dom::TabParent> mTabParent;
|
|
|
|
RefPtr<ChannelEventQueue> mEventQ;
|
|
|
|
nsCString mErrorMsg;
|
|
bool mUseUTF8;
|
|
};
|
|
|
|
} // namespace net
|
|
} // namespace mozilla
|
|
|
|
#endif // mozilla_net_FTPChannelParent_h
|