Make the scriptloader check the HTTP status and not load 404 pages and

such as scripts.  Bug 139040, r=jst, sr=rpotts
This commit is contained in:
bzbarsky%mit.edu 2002-07-01 23:12:13 +00:00
parent 1242faca14
commit 5a892e5796
5 changed files with 36 additions and 12 deletions

View File

@ -617,15 +617,29 @@ nsScriptLoader::OnStreamComplete(nsIStreamLoader* aLoader,
return NS_OK;
}
// If the load returned an error page, then we need to abort
nsCOMPtr<nsIRequest> req;
rv = aLoader->GetRequest(getter_AddRefs(req));
NS_ASSERTION(req, "StreamLoader's request went away prematurely");
if (NS_FAILED(rv)) return rv; // XXX Should this remove the pending request?
nsCOMPtr<nsIHttpChannel> httpChannel(do_QueryInterface(request));
if (httpChannel) {
PRBool requestSucceeded;
rv = httpChannel->GetRequestSucceeded(&requestSucceeded);
if (NS_SUCCEEDED(rv) && !requestSucceeded) {
mPendingRequests.RemoveElement(aContext, 0);
FireScriptAvailable(NS_ERROR_NOT_AVAILABLE, request,
NS_LITERAL_STRING(""));
ProcessPendingReqests();
return NS_OK;
}
}
if (stringLen) {
nsAutoString characterSet, preferred;
nsCOMPtr<nsIUnicodeDecoder> unicodeDecoder;
nsCOMPtr<nsIChannel> channel;
nsCOMPtr<nsIRequest> req;
rv = aLoader->GetRequest(getter_AddRefs(req));
NS_ASSERTION(req, "StreamLoader's request went away prematurely");
if (NS_FAILED(rv)) return rv;
channel = do_QueryInterface(req);
if (channel) {

View File

@ -626,10 +626,9 @@ SheetLoadData::OnStreamComplete(nsIStreamLoader* aLoader,
PRBool realDocument = PR_TRUE;
nsCOMPtr<nsIHttpChannel> httpChannel(do_QueryInterface(request));
if (httpChannel) {
PRUint32 statusCode;
result = httpChannel->GetResponseStatus(&statusCode);
// Only accept 2xx responses
if (NS_SUCCEEDED(result) && statusCode / 100 != 2) {
PRBool requestSucceeded;
result = httpChannel->GetRequestSucceeded(&requestSucceeded);
if (NS_SUCCEEDED(result) && !requestSucceeded) {
realDocument = PR_FALSE;
}
}

View File

@ -626,10 +626,9 @@ SheetLoadData::OnStreamComplete(nsIStreamLoader* aLoader,
PRBool realDocument = PR_TRUE;
nsCOMPtr<nsIHttpChannel> httpChannel(do_QueryInterface(request));
if (httpChannel) {
PRUint32 statusCode;
result = httpChannel->GetResponseStatus(&statusCode);
// Only accept 2xx responses
if (NS_SUCCEEDED(result) && statusCode / 100 != 2) {
PRBool requestSucceeded;
result = httpChannel->GetRequestSucceeded(&requestSucceeded);
if (NS_SUCCEEDED(result) && !requestSucceeded) {
realDocument = PR_FALSE;
}
}

View File

@ -77,6 +77,7 @@ interface nsIHttpChannel : nsIChannel
readonly attribute unsigned long responseStatus;
readonly attribute ACString responseStatusText;
readonly attribute boolean requestSucceeded;
/**
* Header strings are case insensitive

View File

@ -2663,6 +2663,17 @@ nsHttpChannel::GetResponseStatusText(nsACString &value)
return NS_OK;
}
NS_IMETHODIMP
nsHttpChannel::GetRequestSucceeded(PRBool *value)
{
NS_PRECONDITION(value, "Don't ever pass a null arg to this function");
if (!mResponseHead)
return NS_ERROR_NOT_AVAILABLE;
PRUint32 status = mResponseHead->Status();
*value = (status / 100 == 2);
return NS_OK;
}
NS_IMETHODIMP
nsHttpChannel::GetResponseHeader(const nsACString &header, nsACString &value)
{