Prevent CancelAuth from doing things twice.
Previously, CancelAuth would cause the URLRequestHttpJob to resume at a
point earlier than where the caller was informed of the auth challenge
resulting in doing a number of things twice (Setting cookies, calling
into the network delegate, logging a histogram, setting various
headers received times).
This CL fixes that, causing the URLRequestHttpJob to resume at the step
right after it informed the called of the auth challenge.
Bug: 971836
Change-Id: I8db5f759075799ed338ac0ce8dcc941c9d07e777
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1649078
Reviewed-by: Asanka Herath <[email protected]>
Commit-Queue: Matt Menke <[email protected]>
Cr-Commit-Position: refs/heads/master@{#668126}
diff --git a/net/url_request/url_request_http_job.cc b/net/url_request/url_request_http_job.cc
index 80c73f7..8d6d3f13 100644
--- a/net/url_request/url_request_http_job.cc
+++ b/net/url_request/url_request_http_job.cc
@@ -1236,7 +1236,6 @@
}
void URLRequestHttpJob::CancelAuth() {
- // Proxy gets set first, then WWW.
if (proxy_auth_state_ == AUTH_STATE_NEED_AUTH) {
proxy_auth_state_ = AUTH_STATE_CANCELED;
} else {
@@ -1244,26 +1243,18 @@
server_auth_state_ = AUTH_STATE_CANCELED;
}
- // These will be reset in OnStartCompleted.
- response_info_ = nullptr;
- receive_headers_end_ = base::TimeTicks::Now();
- // TODO(davidben,mmenke): We should either reset override_response_headers_
- // here or not call NotifyHeadersReceived a second time on the same response
- // headers. See https://crbug.com/810063.
+ // The above lines should ensure this is the case.
+ DCHECK(!NeedsAuth());
- ResetTimer();
-
- // OK, let the consumer read the error page...
+ // Let the consumer read the HTTP error page. NeedsAuth() should now return
+ // false, so NotifyHeadersComplete() should not request auth from the client
+ // again.
//
- // Because we set the AUTH_STATE_CANCELED flag, NeedsAuth will return false,
- // which will cause the consumer to receive OnResponseStarted instead of
- // OnAuthRequired.
- //
- // We have to do this via InvokeLater to avoid "recursing" the consumer.
- //
+ // Have to do this via PostTask to avoid re-entrantly calling into the
+ // consumer.
base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE, base::BindOnce(&URLRequestHttpJob::OnStartCompleted,
- weak_factory_.GetWeakPtr(), OK));
+ FROM_HERE, base::BindOnce(&URLRequestHttpJob::NotifyFinalHeadersReceived,
+ weak_factory_.GetWeakPtr()));
}
void URLRequestHttpJob::ContinueWithCertificate(