NS_IMETHODIMP HttpChannelParent::StartRedirect(PRUint32 newChannelId, nsIChannel* newChannel, PRUint32 redirectFlags, nsIAsyncVerifyRedirectCallback* callback) { if (mIPCClosed) return NS_BINDING_ABORTED; nsCOMPtr<nsIURI> newURI; newChannel->GetURI(getter_AddRefs(newURI)); nsHttpChannel *httpChan = static_cast<nsHttpChannel *>(mChannel.get()); nsHttpResponseHead *responseHead = httpChan->GetResponseHead(); bool result = SendRedirect1Begin(newChannelId, IPC::URI(newURI), redirectFlags, responseHead ? *responseHead : nsHttpResponseHead()); if (!result) return NS_BINDING_ABORTED; // Result is handled in RecvRedirect2Verify above mRedirectChannel = newChannel; mRedirectCallback = callback; return NS_OK; }
NS_IMETHODIMP HttpChannelParent::OnStartRequest(nsIRequest *aRequest, nsISupports *aContext) { LOG(("HttpChannelParent::OnStartRequest [this=%x]\n", this)); nsHttpChannel *chan = static_cast<nsHttpChannel *>(aRequest); nsHttpResponseHead *responseHead = chan->GetResponseHead(); nsHttpRequestHead *requestHead = chan->GetRequestHead(); bool isFromCache = false; chan->IsFromCache(&isFromCache); PRUint32 expirationTime = nsICache::NO_EXPIRATION_TIME; chan->GetCacheTokenExpirationTime(&expirationTime); nsCString cachedCharset; chan->GetCacheTokenCachedCharset(cachedCharset); bool loadedFromApplicationCache; chan->GetLoadedFromApplicationCache(&loadedFromApplicationCache); if (loadedFromApplicationCache) { nsCOMPtr<nsIApplicationCache> appCache; chan->GetApplicationCache(getter_AddRefs(appCache)); nsCString appCacheGroupId; nsCString appCacheClientId; appCache->GetGroupID(appCacheGroupId); appCache->GetClientID(appCacheClientId); if (mIPCClosed || !SendAssociateApplicationCache(appCacheGroupId, appCacheClientId)) { return NS_ERROR_UNEXPECTED; } } nsCOMPtr<nsIEncodedChannel> encodedChannel = do_QueryInterface(aRequest); if (encodedChannel) encodedChannel->SetApplyConversion(PR_FALSE); // Keep the cache entry for future use in RecvSetCacheTokenCachedCharset(). // It could be already released by nsHttpChannel at that time. chan->GetCacheToken(getter_AddRefs(mCacheDescriptor)); nsCString secInfoSerialization; nsCOMPtr<nsISupports> secInfoSupp; chan->GetSecurityInfo(getter_AddRefs(secInfoSupp)); if (secInfoSupp) { mAssociatedContentSecurity = do_QueryInterface(secInfoSupp); nsCOMPtr<nsISerializable> secInfoSer = do_QueryInterface(secInfoSupp); if (secInfoSer) NS_SerializeToString(secInfoSer, secInfoSerialization); } // sync request headers to child, in case they've changed RequestHeaderTuples headers; mHeadersToSyncToChild = &headers; requestHead->Headers().VisitHeaders(this); mHeadersToSyncToChild = 0; nsHttpChannel *httpChan = static_cast<nsHttpChannel *>(mChannel.get()); if (mIPCClosed || !SendOnStartRequest(responseHead ? *responseHead : nsHttpResponseHead(), !!responseHead, headers, isFromCache, mCacheDescriptor ? PR_TRUE : PR_FALSE, expirationTime, cachedCharset, secInfoSerialization, httpChan->GetSelfAddr(), httpChan->GetPeerAddr())) { return NS_ERROR_UNEXPECTED; } return NS_OK; }
NS_IMETHODIMP HttpChannelParent::OnStartRequest(nsIRequest *aRequest, nsISupports *aContext) { LOG(("HttpChannelParent::OnStartRequest [this=%x]\n", this)); nsHttpChannel *chan = static_cast<nsHttpChannel *>(aRequest); nsHttpResponseHead *responseHead = chan->GetResponseHead(); nsHttpRequestHead *requestHead = chan->GetRequestHead(); PRBool isFromCache = false; chan->IsFromCache(&isFromCache); PRUint32 expirationTime = nsICache::NO_EXPIRATION_TIME; chan->GetCacheTokenExpirationTime(&expirationTime); nsCString cachedCharset; chan->GetCacheTokenCachedCharset(cachedCharset); PRBool loadedFromApplicationCache; chan->GetLoadedFromApplicationCache(&loadedFromApplicationCache); if (loadedFromApplicationCache) { nsCOMPtr<nsIApplicationCache> appCache; chan->GetApplicationCache(getter_AddRefs(appCache)); nsCString appCacheGroupId; nsCString appCacheClientId; appCache->GetGroupID(appCacheGroupId); appCache->GetClientID(appCacheClientId); if (mIPCClosed || !SendAssociateApplicationCache(appCacheGroupId, appCacheClientId)) { return NS_ERROR_UNEXPECTED; } } nsCOMPtr<nsIEncodedChannel> encodedChannel = do_QueryInterface(aRequest); if (encodedChannel) encodedChannel->SetApplyConversion(PR_FALSE); // Keep the cache entry for future use in RecvSetCacheTokenCachedCharset(). // It could be already released by nsHttpChannel at that time. chan->GetCacheToken(getter_AddRefs(mCacheDescriptor)); nsCString secInfoSerialization; nsCOMPtr<nsISupports> secInfoSupp; chan->GetSecurityInfo(getter_AddRefs(secInfoSupp)); if (secInfoSupp) { nsCOMPtr<nsISerializable> secInfoSer = do_QueryInterface(secInfoSupp); if (secInfoSer) NS_SerializeToString(secInfoSer, secInfoSerialization); } RequestHeaderTuples headers; nsHttpHeaderArray harray = requestHead->Headers(); for (PRUint32 i = 0; i < harray.Count(); i++) { RequestHeaderTuple* tuple = headers.AppendElement(); tuple->mHeader = harray.Headers()[i].header; tuple->mValue = harray.Headers()[i].value; tuple->mMerge = false; } if (mIPCClosed || !SendOnStartRequest(responseHead ? *responseHead : nsHttpResponseHead(), !!responseHead, headers, isFromCache, mCacheDescriptor ? PR_TRUE : PR_FALSE, expirationTime, cachedCharset, secInfoSerialization)) { return NS_ERROR_UNEXPECTED; } return NS_OK; }