Bug 1341343 - Make sure the channel returns the correct contentLength for alt-data without saving it to the metadata r=michal
MozReview-Commit-ID: 1pXspJwLfJa
* * *
[mq]: fixing.patch
MozReview-Commit-ID: KKS2x2aeHY3
--- a/netwerk/protocol/http/HttpBaseChannel.cpp
+++ b/netwerk/protocol/http/HttpBaseChannel.cpp
@@ -198,16 +198,17 @@ HttpBaseChannel::HttpBaseChannel()
, mAfterOnStartRequestBegun(false)
, mTransferSize(0)
, mDecodedBodySize(0)
, mEncodedBodySize(0)
, mContentWindowId(0)
, mTopLevelOuterContentWindowId(0)
, mRequireCORSPreflight(false)
, mReportCollector(new ConsoleReportCollector())
+ , mAltDataLength(0)
, mForceMainDocumentChannel(false)
, mIsTrackingResource(false)
{
LOG(("Creating HttpBaseChannel @%p\n", this));
// Subfields of unions cannot be targeted in an initializer list.
#ifdef MOZ_VALGRIND
// Zero the entire unions so that Valgrind doesn't complain when we send them
@@ -696,16 +697,21 @@ HttpBaseChannel::GetContentDispositionHe
NS_IMETHODIMP
HttpBaseChannel::GetContentLength(int64_t *aContentLength)
{
NS_ENSURE_ARG_POINTER(aContentLength);
if (!mResponseHead)
return NS_ERROR_NOT_AVAILABLE;
+ if (!mAvailableCachedAltDataType.IsEmpty()) {
+ *aContentLength = mAltDataLength;
+ return NS_OK;
+ }
+
*aContentLength = mResponseHead->ContentLength();
return NS_OK;
}
NS_IMETHODIMP
HttpBaseChannel::SetContentLength(int64_t value)
{
NS_NOTYETIMPLEMENTED("HttpBaseChannel::SetContentLength");
--- a/netwerk/protocol/http/HttpBaseChannel.h
+++ b/netwerk/protocol/http/HttpBaseChannel.h
@@ -331,16 +331,17 @@ public:
nsHttpRequestHead * GetRequestHead() { return &mRequestHead; }
const NetAddr& GetSelfAddr() { return mSelfAddr; }
const NetAddr& GetPeerAddr() { return mPeerAddr; }
MOZ_MUST_USE nsresult OverrideSecurityInfo(nsISupports* aSecurityInfo);
public: /* Necko internal use only... */
+ int64_t GetAltDataLength() { return mAltDataLength; }
bool IsNavigation();
// Return whether upon a redirect code of httpStatus for method, the
// request method should be rewritten to GET.
static bool ShouldRewriteRedirectToGET(uint32_t httpStatus,
nsHttpRequestHead::ParsedMethodType method);
// Like nsIEncodedChannel::DoApplyConversions except context is set to
@@ -599,16 +600,17 @@ protected:
nsTArray<nsCString> mUnsafeHeaders;
nsCOMPtr<nsIConsoleReportCollector> mReportCollector;
// Holds the name of the preferred alt-data type.
nsCString mPreferredCachedAltDataType;
// Holds the name of the alternative data type the channel returned.
nsCString mAvailableCachedAltDataType;
+ int64_t mAltDataLength;
bool mForceMainDocumentChannel;
bool mIsTrackingResource;
nsID mChannelId;
nsString mIntegrityMetadata;
--- a/netwerk/protocol/http/HttpChannelChild.cpp
+++ b/netwerk/protocol/http/HttpChannelChild.cpp
@@ -320,74 +320,78 @@ class StartRequestEvent : public Channel
const bool& aIsFromCache,
const bool& aCacheEntryAvailable,
const uint32_t& aCacheExpirationTime,
const nsCString& aCachedCharset,
const nsCString& aSecurityInfoSerialization,
const NetAddr& aSelfAddr,
const NetAddr& aPeerAddr,
const uint32_t& aCacheKey,
- const nsCString& altDataType)
+ const nsCString& altDataType,
+ const int64_t& altDataLen)
: mChild(aChild)
, mChannelStatus(aChannelStatus)
, mResponseHead(aResponseHead)
, mRequestHeaders(aRequestHeaders)
, mUseResponseHead(aUseResponseHead)
, mIsFromCache(aIsFromCache)
, mCacheEntryAvailable(aCacheEntryAvailable)
, mCacheExpirationTime(aCacheExpirationTime)
, mCachedCharset(aCachedCharset)
, mSecurityInfoSerialization(aSecurityInfoSerialization)
, mSelfAddr(aSelfAddr)
, mPeerAddr(aPeerAddr)
, mCacheKey(aCacheKey)
, mAltDataType(altDataType)
+ , mAltDataLen(altDataLen)
{}
void Run()
{
LOG(("StartRequestEvent [this=%p]\n", mChild));
mChild->OnStartRequest(mChannelStatus, mResponseHead, mUseResponseHead,
mRequestHeaders, mIsFromCache, mCacheEntryAvailable,
mCacheExpirationTime, mCachedCharset,
mSecurityInfoSerialization, mSelfAddr, mPeerAddr,
- mCacheKey, mAltDataType);
+ mCacheKey, mAltDataType, mAltDataLen);
}
private:
HttpChannelChild* mChild;
nsresult mChannelStatus;
nsHttpResponseHead mResponseHead;
nsHttpHeaderArray mRequestHeaders;
bool mUseResponseHead;
bool mIsFromCache;
bool mCacheEntryAvailable;
uint32_t mCacheExpirationTime;
nsCString mCachedCharset;
nsCString mSecurityInfoSerialization;
NetAddr mSelfAddr;
NetAddr mPeerAddr;
uint32_t mCacheKey;
nsCString mAltDataType;
+ int64_t mAltDataLen;
};
mozilla::ipc::IPCResult
HttpChannelChild::RecvOnStartRequest(const nsresult& channelStatus,
const nsHttpResponseHead& responseHead,
const bool& useResponseHead,
const nsHttpHeaderArray& requestHeaders,
const bool& isFromCache,
const bool& cacheEntryAvailable,
const uint32_t& cacheExpirationTime,
const nsCString& cachedCharset,
const nsCString& securityInfoSerialization,
const NetAddr& selfAddr,
const NetAddr& peerAddr,
const int16_t& redirectCount,
const uint32_t& cacheKey,
- const nsCString& altDataType)
+ const nsCString& altDataType,
+ const int64_t& altDataLen)
{
LOG(("HttpChannelChild::RecvOnStartRequest [this=%p]\n", this));
// mFlushedForDiversion and mDivertingToParent should NEVER be set at this
// stage, as they are set in the listener's OnStartRequest.
MOZ_RELEASE_ASSERT(!mFlushedForDiversion,
"mFlushedForDiversion should be unset before OnStartRequest!");
MOZ_RELEASE_ASSERT(!mDivertingToParent,
"mDivertingToParent should be unset before OnStartRequest!");
@@ -397,34 +401,35 @@ HttpChannelChild::RecvOnStartRequest(con
mEventQ->RunOrEnqueue(new StartRequestEvent(this, channelStatus, responseHead,
useResponseHead, requestHeaders,
isFromCache, cacheEntryAvailable,
cacheExpirationTime,
cachedCharset,
securityInfoSerialization,
selfAddr, peerAddr, cacheKey,
- altDataType));
+ altDataType, altDataLen));
return IPC_OK();
}
void
HttpChannelChild::OnStartRequest(const nsresult& channelStatus,
const nsHttpResponseHead& responseHead,
const bool& useResponseHead,
const nsHttpHeaderArray& requestHeaders,
const bool& isFromCache,
const bool& cacheEntryAvailable,
const uint32_t& cacheExpirationTime,
const nsCString& cachedCharset,
const nsCString& securityInfoSerialization,
const NetAddr& selfAddr,
const NetAddr& peerAddr,
const uint32_t& cacheKey,
- const nsCString& altDataType)
+ const nsCString& altDataType,
+ const int64_t& altDataLen)
{
LOG(("HttpChannelChild::OnStartRequest [this=%p]\n", this));
// mFlushedForDiversion and mDivertingToParent should NEVER be set at this
// stage, as they are set in the listener's OnStartRequest.
MOZ_RELEASE_ASSERT(!mFlushedForDiversion,
"mFlushedForDiversion should be unset before OnStartRequest!");
MOZ_RELEASE_ASSERT(!mDivertingToParent,
@@ -445,16 +450,17 @@ HttpChannelChild::OnStartRequest(const n
mIsFromCache = isFromCache;
mCacheEntryAvailable = cacheEntryAvailable;
mCacheExpirationTime = cacheExpirationTime;
mCachedCharset = cachedCharset;
mSelfAddr = selfAddr;
mPeerAddr = peerAddr;
mAvailableCachedAltDataType = altDataType;
+ mAltDataLength = altDataLen;
mAfterOnStartRequestBegun = true;
AutoEventEnqueuer ensureSerialDispatch(mEventQ);
nsresult rv;
nsCOMPtr<nsISupportsPRUint32> container =
do_CreateInstance(NS_SUPPORTS_PRUINT32_CONTRACTID, &rv);
--- a/netwerk/protocol/http/HttpChannelChild.h
+++ b/netwerk/protocol/http/HttpChannelChild.h
@@ -119,17 +119,18 @@ protected:
const bool& cacheEntryAvailable,
const uint32_t& cacheExpirationTime,
const nsCString& cachedCharset,
const nsCString& securityInfoSerialization,
const NetAddr& selfAddr,
const NetAddr& peerAddr,
const int16_t& redirectCount,
const uint32_t& cacheKey,
- const nsCString& altDataType) override;
+ const nsCString& altDataType,
+ const int64_t& altDataLen) override;
mozilla::ipc::IPCResult RecvOnTransportAndData(const nsresult& channelStatus,
const nsresult& status,
const uint64_t& offset,
const uint32_t& count,
const nsCString& data) override;
mozilla::ipc::IPCResult RecvOnStopRequest(const nsresult& statusCode, const ResourceTimingStruct& timing) override;
mozilla::ipc::IPCResult RecvOnProgress(const int64_t& progress, const int64_t& progressMax) override;
mozilla::ipc::IPCResult RecvOnStatus(const nsresult& status) override;
@@ -298,17 +299,18 @@ private:
const bool& isFromCache,
const bool& cacheEntryAvailable,
const uint32_t& cacheExpirationTime,
const nsCString& cachedCharset,
const nsCString& securityInfoSerialization,
const NetAddr& selfAddr,
const NetAddr& peerAddr,
const uint32_t& cacheKey,
- const nsCString& altDataType);
+ const nsCString& altDataType,
+ const int64_t& altDataLen);
void MaybeDivertOnData(const nsCString& data,
const uint64_t& offset,
const uint32_t& count);
void OnTransportAndData(const nsresult& channelStatus,
const nsresult& status,
const uint64_t& offset,
const uint32_t& count,
const nsCString& data);
--- a/netwerk/protocol/http/HttpChannelParent.cpp
+++ b/netwerk/protocol/http/HttpChannelParent.cpp
@@ -1183,32 +1183,34 @@ HttpChannelParent::OnStartRequest(nsIReq
nsresult rv = container->GetData(&cacheKeyValue);
if (NS_FAILED(rv)) {
return rv;
}
}
nsAutoCString altDataType;
chan->GetAlternativeDataType(altDataType);
+ int64_t altDataLen = chan->GetAltDataLength();
// !!! We need to lock headers and please don't forget to unlock them !!!
requestHead->Enter();
nsresult rv = NS_OK;
if (mIPCClosed ||
!SendOnStartRequest(channelStatus,
responseHead ? *responseHead : nsHttpResponseHead(),
!!responseHead,
requestHead->Headers(),
isFromCache,
mCacheEntry ? true : false,
expirationTime, cachedCharset, secInfoSerialization,
chan->GetSelfAddr(), chan->GetPeerAddr(),
redirectCount,
cacheKeyValue,
- altDataType))
+ altDataType,
+ altDataLen))
{
rv = NS_ERROR_UNEXPECTED;
}
requestHead->Exit();
return rv;
}
NS_IMETHODIMP
--- a/netwerk/protocol/http/PHttpChannel.ipdl
+++ b/netwerk/protocol/http/PHttpChannel.ipdl
@@ -103,17 +103,18 @@ child:
bool cacheEntryAvailable,
uint32_t cacheExpirationTime,
nsCString cachedCharset,
nsCString securityInfoSerialization,
NetAddr selfAddr,
NetAddr peerAddr,
int16_t redirectCount,
uint32_t cacheKey,
- nsCString altDataType);
+ nsCString altDataType,
+ int64_t altDataLength);
// Combines a single OnDataAvailable and its associated OnProgress &
// OnStatus calls into one IPDL message
async OnTransportAndData(nsresult channelStatus,
nsresult transportStatus,
uint64_t offset,
uint32_t count,
nsCString data);
--- a/netwerk/protocol/http/nsHttpChannel.cpp
+++ b/netwerk/protocol/http/nsHttpChannel.cpp
@@ -4620,22 +4620,20 @@ nsHttpChannel::OpenCacheInputStream(nsIC
// If an alternate representation was requested, try to open the alt
// input stream.
if (!mPreferredCachedAltDataType.IsEmpty()) {
rv = cacheEntry->OpenAlternativeInputStream(mPreferredCachedAltDataType,
getter_AddRefs(stream));
if (NS_SUCCEEDED(rv)) {
// We have succeeded.
mAvailableCachedAltDataType = mPreferredCachedAltDataType;
- // Clear the header.
- mCachedResponseHead->SetContentLength(-1);
// Set the correct data size on the channel.
int64_t altDataSize;
if (NS_SUCCEEDED(cacheEntry->GetAltDataSize(&altDataSize))) {
- mCachedResponseHead->SetContentLength(altDataSize);
+ mAltDataLength = altDataSize;
}
}
}
if (!stream) {
rv = cacheEntry->OpenInputStream(0, getter_AddRefs(stream));
}