15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/loader/throttling_resource_handler.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/browser/loader/resource_request_info_impl.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/resource_throttle.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/resource_response.h"
10a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "net/url_request/url_request.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ThrottlingResourceHandler::ThrottlingResourceHandler(
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<ResourceHandler> next_handler,
1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    net::URLRequest* request,
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScopedVector<ResourceThrottle> throttles)
184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    : LayeredResourceHandler(request, next_handler.Pass()),
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      deferred_stage_(DEFERRED_NONE),
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      throttles_(throttles.Pass()),
21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      next_index_(0),
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      cancelled_by_resource_throttle_(false) {
23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  for (size_t i = 0; i < throttles_.size(); ++i) {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    throttles_[i]->set_controller(this);
25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Throttles must have a name, as otherwise, bugs where a throttle fails
26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // to resume a request can be very difficult to debug.
27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    DCHECK(throttles_[i]->GetNameForLogging());
28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ThrottlingResourceHandler::~ThrottlingResourceHandler() {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)bool ThrottlingResourceHandler::OnRequestRedirected(
356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const net::RedirectInfo& redirect_info,
366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ResourceResponse* response,
376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    bool* defer) {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!cancelled_by_resource_throttle_);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *defer = false;
41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  while (next_index_ < throttles_.size()) {
42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    int index = next_index_;
436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    throttles_[index]->WillRedirectRequest(redirect_info.new_url, defer);
44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    next_index_++;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cancelled_by_resource_throttle_)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (*defer) {
48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      OnRequestDefered(index);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      deferred_stage_ = DEFERRED_REDIRECT;
506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      deferred_redirect_ = redirect_info;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      deferred_response_ = response;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;  // Do not cancel.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  next_index_ = 0;  // Reset for next time.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return next_handler_->OnRequestRedirected(redirect_info, response, defer);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool ThrottlingResourceHandler::OnWillStart(const GURL& url, bool* defer) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!cancelled_by_resource_throttle_);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *defer = false;
65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  while (next_index_ < throttles_.size()) {
66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    int index = next_index_;
67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    throttles_[index]->WillStartRequest(defer);
68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    next_index_++;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cancelled_by_resource_throttle_)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (*defer) {
72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      OnRequestDefered(index);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      deferred_stage_ = DEFERRED_START;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      deferred_url_ = url;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;  // Do not cancel.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  next_index_ = 0;  // Reset for next time.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return next_handler_->OnWillStart(url, defer);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool ThrottlingResourceHandler::OnBeforeNetworkStart(const GURL& url,
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                     bool* defer) {
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(!cancelled_by_resource_throttle_);
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  *defer = false;
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  while (next_index_ < throttles_.size()) {
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int index = next_index_;
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    throttles_[index]->WillStartUsingNetwork(defer);
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    next_index_++;
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (cancelled_by_resource_throttle_)
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return false;
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (*defer) {
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      OnRequestDefered(index);
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      deferred_stage_ = DEFERRED_NETWORK_START;
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      deferred_url_ = url;
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return true;  // Do not cancel.
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  next_index_ = 0;  // Reset for next time.
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return next_handler_->OnBeforeNetworkStart(url, defer);
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool ThrottlingResourceHandler::OnResponseStarted(ResourceResponse* response,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  bool* defer) {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!cancelled_by_resource_throttle_);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  while (next_index_ < throttles_.size()) {
113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    int index = next_index_;
114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    throttles_[index]->WillProcessResponse(defer);
115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    next_index_++;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (cancelled_by_resource_throttle_)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (*defer) {
119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      OnRequestDefered(index);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      deferred_stage_ = DEFERRED_RESPONSE;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      deferred_response_ = response;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;  // Do not cancel.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  next_index_ = 0;  // Reset for next time.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return next_handler_->OnResponseStarted(response, defer);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ThrottlingResourceHandler::Cancel() {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cancelled_by_resource_throttle_ = true;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller()->Cancel();
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ThrottlingResourceHandler::CancelAndIgnore() {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cancelled_by_resource_throttle_ = true;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller()->CancelAndIgnore();
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ThrottlingResourceHandler::CancelWithError(int error_code) {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cancelled_by_resource_throttle_ = true;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller()->CancelWithError(error_code);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ThrottlingResourceHandler::Resume() {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!cancelled_by_resource_throttle_);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeferredStage last_deferred_stage = deferred_stage_;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  deferred_stage_ = DEFERRED_NONE;
151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Clear information about the throttle that delayed the request.
152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  request()->LogUnblocked();
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (last_deferred_stage) {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DEFERRED_NONE:
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DEFERRED_START:
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ResumeStart();
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case DEFERRED_NETWORK_START:
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ResumeNetworkStart();
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DEFERRED_REDIRECT:
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ResumeRedirect();
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DEFERRED_RESPONSE:
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ResumeResponse();
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ThrottlingResourceHandler::ResumeStart() {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!cancelled_by_resource_throttle_);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = deferred_url_;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  deferred_url_ = GURL();
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool defer = false;
179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!OnWillStart(url, &defer)) {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    controller()->Cancel();
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  } else if (!defer) {
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    controller()->Resume();
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ThrottlingResourceHandler::ResumeNetworkStart() {
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(!cancelled_by_resource_throttle_);
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GURL url = deferred_url_;
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  deferred_url_ = GURL();
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool defer = false;
193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!OnBeforeNetworkStart(url, &defer)) {
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    controller()->Cancel();
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (!defer) {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    controller()->Resume();
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ThrottlingResourceHandler::ResumeRedirect() {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!cancelled_by_resource_throttle_);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  net::RedirectInfo redirect_info = deferred_redirect_;
2046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  deferred_redirect_ = net::RedirectInfo();
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<ResourceResponse> response;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  deferred_response_.swap(response);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool defer = false;
2096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!OnRequestRedirected(redirect_info, response.get(), &defer)) {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    controller()->Cancel();
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (!defer) {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    controller()->Resume();
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ThrottlingResourceHandler::ResumeResponse() {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!cancelled_by_resource_throttle_);
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<ResourceResponse> response;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  deferred_response_.swap(response);
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool defer = false;
223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!OnResponseStarted(response.get(), &defer)) {
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    controller()->Cancel();
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (!defer) {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    controller()->Resume();
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void ThrottlingResourceHandler::OnRequestDefered(int throttle_index) {
231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  request()->LogBlockedBy(throttles_[throttle_index]->GetNameForLogging());
232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
235