Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2780)

Unified Diff: net/url_request/url_request_http_job.cc

Issue 12701011: [Net] Propagate priority changes from URLRequest to HttpTransaction (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix use-after-free bug Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: net/url_request/url_request_http_job.cc
diff --git a/net/url_request/url_request_http_job.cc b/net/url_request/url_request_http_job.cc
index fcf296b1e772498a438a905c3dd86d3897a7f4ad..e2cd99da864fce7822eb1e635d9f5c0664c0530c 100644
--- a/net/url_request/url_request_http_job.cc
+++ b/net/url_request/url_request_http_job.cc
@@ -228,6 +228,7 @@ URLRequestHttpJob::URLRequestHttpJob(
NetworkDelegate* network_delegate,
const HttpUserAgentSettings* http_user_agent_settings)
: URLRequestJob(request, network_delegate),
+ priority_(DEFAULT_PRIORITY),
response_info_(NULL),
response_cookies_save_index_(0),
proxy_auth_state_(AUTH_STATE_DONT_NEED_AUTH),
@@ -268,6 +269,87 @@ URLRequestHttpJob::URLRequestHttpJob(
ResetTimer();
}
+URLRequestHttpJob::~URLRequestHttpJob() {
+ CHECK(!awaiting_callback_);
+
+ DCHECK(!sdch_test_control_ || !sdch_test_activated_);
+ if (!is_cached_content_) {
+ if (sdch_test_control_)
+ RecordPacketStats(FilterContext::SDCH_EXPERIMENT_HOLDBACK);
+ if (sdch_test_activated_)
+ RecordPacketStats(FilterContext::SDCH_EXPERIMENT_DECODE);
+ }
+ // Make sure SDCH filters are told to emit histogram data while
+ // filter_context_ is still alive.
+ DestroyFilters();
+
+ if (sdch_dictionary_url_.is_valid()) {
+ // Prior to reaching the destructor, request_ has been set to a NULL
+ // pointer, so request_->url() is no longer valid in the destructor, and we
+ // use an alternate copy |request_info_.url|.
+ SdchManager* manager = SdchManager::Global();
+ // To be extra safe, since this is a "different time" from when we decided
+ // to get the dictionary, we'll validate that an SdchManager is available.
+ // At shutdown time, care is taken to be sure that we don't delete this
+ // globally useful instance "too soon," so this check is just defensive
+ // coding to assure that IF the system is shutting down, we don't have any
+ // problem if the manager was deleted ahead of time.
+ if (manager) // Defensive programming.
+ manager->FetchDictionary(request_info_.url, sdch_dictionary_url_);
+ }
+ DoneWithRequest(ABORTED);
+}
+
+void URLRequestHttpJob::SetPriority(RequestPriority priority) {
+ priority_ = priority;
+ if (transaction_)
+ transaction_->SetPriority(priority_);
+}
+
+void URLRequestHttpJob::Start() {
+ DCHECK(!transaction_.get());
+
+ // Ensure that we do not send username and password fields in the referrer.
+ GURL referrer(request_->GetSanitizedReferrer());
+
+ request_info_.url = request_->url();
+ request_info_.method = request_->method();
+ request_info_.load_flags = request_->load_flags();
+ request_info_.request_id = request_->identifier();
+
+ // Strip Referer from request_info_.extra_headers to prevent, e.g., plugins
+ // from overriding headers that are controlled using other means. Otherwise a
+ // plugin could set a referrer although sending the referrer is inhibited.
+ request_info_.extra_headers.RemoveHeader(HttpRequestHeaders::kReferer);
+
+ // Our consumer should have made sure that this is a safe referrer. See for
+ // instance WebCore::FrameLoader::HideReferrer.
+ if (referrer.is_valid()) {
+ request_info_.extra_headers.SetHeader(HttpRequestHeaders::kReferer,
+ referrer.spec());
+ }
+
+ request_info_.extra_headers.SetHeaderIfMissing(
+ HttpRequestHeaders::kUserAgent,
+ http_user_agent_settings_ ?
+ http_user_agent_settings_->GetUserAgent(request_->url()) :
+ EmptyString());
+
+ AddExtraHeaders();
+ AddCookieHeaderAndStart();
+}
+
+void URLRequestHttpJob::Kill() {
+ http_transaction_delegate_->OnDetachRequest();
+
+ if (!transaction_.get())
+ return;
+
+ weak_factory_.InvalidateWeakPtrs();
+ DestroyTransaction();
+ URLRequestJob::Kill();
+}
+
void URLRequestHttpJob::NotifyHeadersComplete() {
DCHECK(!response_info_);
@@ -394,7 +476,7 @@ void URLRequestHttpJob::StartTransactionInternal() {
DCHECK(request_->context()->http_transaction_factory());
rv = request_->context()->http_transaction_factory()->CreateTransaction(
- request_->priority(), &transaction_, http_transaction_delegate_.get());
+ priority_, &transaction_, http_transaction_delegate_.get());
if (rv == OK) {
if (!throttling_entry_ ||
!throttling_entry_->ShouldRejectRequest(*request_)) {
@@ -859,50 +941,6 @@ void URLRequestHttpJob::SetExtraRequestHeaders(
request_info_.extra_headers.CopyFrom(headers);
}
-void URLRequestHttpJob::Start() {
- DCHECK(!transaction_.get());
-
- // Ensure that we do not send username and password fields in the referrer.
- GURL referrer(request_->GetSanitizedReferrer());
-
- request_info_.url = request_->url();
- request_info_.method = request_->method();
- request_info_.load_flags = request_->load_flags();
- request_info_.request_id = request_->identifier();
-
- // Strip Referer from request_info_.extra_headers to prevent, e.g., plugins
- // from overriding headers that are controlled using other means. Otherwise a
- // plugin could set a referrer although sending the referrer is inhibited.
- request_info_.extra_headers.RemoveHeader(HttpRequestHeaders::kReferer);
-
- // Our consumer should have made sure that this is a safe referrer. See for
- // instance WebCore::FrameLoader::HideReferrer.
- if (referrer.is_valid()) {
- request_info_.extra_headers.SetHeader(HttpRequestHeaders::kReferer,
- referrer.spec());
- }
-
- request_info_.extra_headers.SetHeaderIfMissing(
- HttpRequestHeaders::kUserAgent,
- http_user_agent_settings_ ?
- http_user_agent_settings_->GetUserAgent(request_->url()) :
- EmptyString());
-
- AddExtraHeaders();
- AddCookieHeaderAndStart();
-}
-
-void URLRequestHttpJob::Kill() {
- http_transaction_delegate_->OnDetachRequest();
-
- if (!transaction_.get())
- return;
-
- weak_factory_.InvalidateWeakPtrs();
- DestroyTransaction();
- URLRequestJob::Kill();
-}
-
LoadState URLRequestHttpJob::GetLoadState() const {
return transaction_.get() ?
transaction_->GetLoadState() : LOAD_STATE_IDLE;
@@ -1230,37 +1268,6 @@ HostPortPair URLRequestHttpJob::GetSocketAddress() const {
return response_info_ ? response_info_->socket_address : HostPortPair();
}
-URLRequestHttpJob::~URLRequestHttpJob() {
- CHECK(!awaiting_callback_);
-
- DCHECK(!sdch_test_control_ || !sdch_test_activated_);
- if (!is_cached_content_) {
- if (sdch_test_control_)
- RecordPacketStats(FilterContext::SDCH_EXPERIMENT_HOLDBACK);
- if (sdch_test_activated_)
- RecordPacketStats(FilterContext::SDCH_EXPERIMENT_DECODE);
- }
- // Make sure SDCH filters are told to emit histogram data while
- // filter_context_ is still alive.
- DestroyFilters();
-
- if (sdch_dictionary_url_.is_valid()) {
- // Prior to reaching the destructor, request_ has been set to a NULL
- // pointer, so request_->url() is no longer valid in the destructor, and we
- // use an alternate copy |request_info_.url|.
- SdchManager* manager = SdchManager::Global();
- // To be extra safe, since this is a "different time" from when we decided
- // to get the dictionary, we'll validate that an SdchManager is available.
- // At shutdown time, care is taken to be sure that we don't delete this
- // globally useful instance "too soon," so this check is just defensive
- // coding to assure that IF the system is shutting down, we don't have any
- // problem if the manager was deleted ahead of time.
- if (manager) // Defensive programming.
- manager->FetchDictionary(request_info_.url, sdch_dictionary_url_);
- }
- DoneWithRequest(ABORTED);
-}
-
void URLRequestHttpJob::RecordTimer() {
if (request_creation_time_.is_null()) {
NOTREACHED()

Powered by Google App Engine
This is Rietveld 408576698