1 // Copyright 2019 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chromecast/common/cast_url_loader_throttle.h"
6 
7 #include "base/bind.h"
8 #include "base/callback.h"
9 #include "base/check.h"
10 #include "base/notreached.h"
11 #include "net/base/net_errors.h"
12 #include "services/network/public/cpp/resource_request.h"
13 
14 namespace chromecast {
15 
CastURLLoaderThrottle(Delegate * delegate,const std::string & session_id)16 CastURLLoaderThrottle::CastURLLoaderThrottle(
17     Delegate* delegate,
18     const std::string& session_id)
19     : settings_delegate_(delegate),
20       session_id_(session_id),
21       weak_factory_(this) {
22   DCHECK(settings_delegate_);
23   weak_this_ = weak_factory_.GetWeakPtr();
24 }
25 
26 CastURLLoaderThrottle::~CastURLLoaderThrottle() = default;
27 
DetachFromCurrentSequence()28 void CastURLLoaderThrottle::DetachFromCurrentSequence() {}
29 
WillStartRequest(network::ResourceRequest * request,bool * defer)30 void CastURLLoaderThrottle::WillStartRequest(
31     network::ResourceRequest* request,
32     bool* defer) {
33   int error = settings_delegate_->WillStartResourceRequest(
34       request, session_id_,
35       base::BindOnce(&CastURLLoaderThrottle::ResumeRequest, weak_this_));
36   if (error == net::ERR_IO_PENDING) {
37     deferred_ = true;
38     *defer = true;
39   }
40 }
41 
makes_unsafe_redirect()42 bool CastURLLoaderThrottle::makes_unsafe_redirect() {
43   // Yes, this makes cross-scheme redirects.
44   return true;
45 }
46 
ResumeRequest(int error,net::HttpRequestHeaders headers,net::HttpRequestHeaders cors_exempt_headers)47 void CastURLLoaderThrottle::ResumeRequest(
48     int error,
49     net::HttpRequestHeaders headers,
50     net::HttpRequestHeaders cors_exempt_headers) {
51   DCHECK(deferred_);
52   if (error != net::OK) {
53     NOTREACHED() << "Trying to resume a request with unexpected error: "
54                  << error;
55     return;
56   }
57   deferred_ = false;
58   delegate_->UpdateDeferredRequestHeaders(headers, cors_exempt_headers);
59   delegate_->Resume();
60 }
61 
62 }  // namespace chromecast
63