void GetRequestURLFromChrome(const nsAString& aInput, nsAString& aRequestURL, nsACString& aURLfragment, ErrorResult& aRv) { nsCOMPtr<nsIURI> uri = ParseURLFromChrome(aInput, aRv); if (aRv.Failed()) { return; } // This fails with URIs with weird protocols, even when they are valid, // so we ignore the failure nsAutoCString credentials; Unused << uri->GetUserPass(credentials); if (!credentials.IsEmpty()) { aRv.ThrowTypeError<MSG_URL_HAS_CREDENTIALS>(aInput); return; } nsCOMPtr<nsIURI> uriClone; aRv = NS_GetURIWithoutRef(uri, getter_AddRefs(uriClone)); if (NS_WARN_IF(aRv.Failed())) { return; } nsAutoCString spec; aRv = uriClone->GetSpec(spec); if (NS_WARN_IF(aRv.Failed())) { return; } CopyUTF8toUTF16(spec, aRequestURL); // Get the fragment from nsIURI. aRv = uri->GetRef(aURLfragment); if (NS_WARN_IF(aRv.Failed())) { return; } }
NS_IMETHODIMP FetchDriver::AsyncOnChannelRedirect(nsIChannel* aOldChannel, nsIChannel* aNewChannel, uint32_t aFlags, nsIAsyncVerifyRedirectCallback *aCallback) { nsCOMPtr<nsIHttpChannel> httpChannel = do_QueryInterface(aNewChannel); if (httpChannel) { SetRequestHeaders(httpChannel); } nsCOMPtr<nsIHttpChannel> oldHttpChannel = do_QueryInterface(aOldChannel); nsAutoCString tRPHeaderCValue; if (oldHttpChannel) { Unused << oldHttpChannel->GetResponseHeader(NS_LITERAL_CSTRING("referrer-policy"), tRPHeaderCValue); } // "HTTP-redirect fetch": step 14 "Append locationURL to request's URL list." // However, ignore internal redirects here. We don't want to flip // Response.redirected to true if an internal redirect occurs. These // should be transparent to script. if (!(aFlags & nsIChannelEventSink::REDIRECT_INTERNAL)) { nsCOMPtr<nsIURI> uri; MOZ_ALWAYS_SUCCEEDS(aNewChannel->GetURI(getter_AddRefs(uri))); nsCOMPtr<nsIURI> uriClone; nsresult rv = NS_GetURIWithoutRef(uri, getter_AddRefs(uriClone)); if(NS_WARN_IF(NS_FAILED(rv))){ return rv; } nsCString spec; rv = uriClone->GetSpec(spec); if(NS_WARN_IF(NS_FAILED(rv))){ return rv; } nsCString fragment; rv = uri->GetRef(fragment); if(NS_WARN_IF(NS_FAILED(rv))){ return rv; } mRequest->AddURL(spec, fragment); } NS_ConvertUTF8toUTF16 tRPHeaderValue(tRPHeaderCValue); // updates request’s associated referrer policy according to the // Referrer-Policy header (if any). if (!tRPHeaderValue.IsEmpty()) { net::ReferrerPolicy net_referrerPolicy = nsContentUtils::GetReferrerPolicyFromHeader(tRPHeaderValue); if (net_referrerPolicy != net::RP_Unset) { mRequest->SetReferrerPolicy(net_referrerPolicy); // Should update channel's referrer policy if (httpChannel) { nsresult rv = FetchUtil::SetRequestReferrer(mPrincipal, mDocument, httpChannel, mRequest); NS_ENSURE_SUCCESS(rv, rv); } } } aCallback->OnRedirectVerifyCallback(NS_OK); return NS_OK; }