 d663b4eaee
			
		
	
	
	
	
	d663b4eaee* chore: fix cpplint 'include_what_you_use' warnings Typically by including <memory>, <utility> etc. * chore: fix 'static/global string constant' warning Use C style strings instead of std::string. Style guide forbids non-trivial static / global variables. https://google.github.io/styleguide/cppguide.html#Static_and_Global_Variables /home/charles/electron/electron-gn/src/electron/script/cpplint.js * refactor: remove global string variables. Fix 'global string variables are not permitted' linter warnings by using the base::NoDestructor<> wrapper to make it explicit that these variables are never destroyed. The style guide's take on globals with nontrivial destructors: https://google.github.io/styleguide/cppguide.html#Static_and_Global_Variables * fix: initializer error introduced in last commit * fix: remove WIP file that was included by accident * fix: include order * fix: include order * fix: include order * fix: include order, again
		
			
				
	
	
		
			166 lines
		
	
	
	
		
			5.8 KiB
			
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			166 lines
		
	
	
	
		
			5.8 KiB
			
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Copyright (c) 2018 GitHub, Inc.
 | |
| // Use of this source code is governed by the MIT license that can be
 | |
| // found in the LICENSE file.
 | |
| 
 | |
| #include "atom/browser/request_context_delegate.h"
 | |
| 
 | |
| #include <memory>
 | |
| #include <utility>
 | |
| 
 | |
| #include "atom/browser/api/atom_api_protocol.h"
 | |
| #include "atom/browser/net/about_protocol_handler.h"
 | |
| #include "atom/browser/net/asar/asar_protocol_handler.h"
 | |
| #include "atom/browser/net/atom_cert_verifier.h"
 | |
| #include "atom/browser/net/atom_network_delegate.h"
 | |
| #include "atom/browser/net/atom_url_request_job_factory.h"
 | |
| #include "atom/browser/net/cookie_details.h"
 | |
| #include "atom/browser/net/http_protocol_handler.h"
 | |
| #include "atom/common/options_switches.h"
 | |
| #include "base/strings/string_number_conversions.h"
 | |
| #include "base/task_scheduler/post_task.h"
 | |
| #include "content/public/browser/browser_thread.h"
 | |
| #include "content/public/common/url_constants.h"
 | |
| #include "net/ftp/ftp_network_layer.h"
 | |
| #include "net/url_request/data_protocol_handler.h"
 | |
| #include "net/url_request/ftp_protocol_handler.h"
 | |
| #include "net/url_request/url_request_context.h"
 | |
| #include "net/url_request/url_request_intercepting_job_factory.h"
 | |
| #include "url/url_constants.h"
 | |
| 
 | |
| using content::BrowserThread;
 | |
| 
 | |
| namespace atom {
 | |
| 
 | |
| namespace {
 | |
| 
 | |
| class NoCacheBackend : public net::HttpCache::BackendFactory {
 | |
|   int CreateBackend(net::NetLog* net_log,
 | |
|                     std::unique_ptr<disk_cache::Backend>* backend,
 | |
|                     const net::CompletionCallback& callback) override {
 | |
|     return net::ERR_FAILED;
 | |
|   }
 | |
| };
 | |
| 
 | |
| }  // namespace
 | |
| 
 | |
| RequestContextDelegate::RequestContextDelegate(bool use_cache)
 | |
|     : use_cache_(use_cache), weak_factory_(this) {}
 | |
| 
 | |
| RequestContextDelegate::~RequestContextDelegate() {}
 | |
| 
 | |
| std::unique_ptr<base::CallbackList<void(const CookieDetails*)>::Subscription>
 | |
| RequestContextDelegate::RegisterCookieChangeCallback(
 | |
|     const base::Callback<void(const CookieDetails*)>& cb) {
 | |
|   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 | |
| 
 | |
|   return cookie_change_sub_list_.Add(cb);
 | |
| }
 | |
| 
 | |
| void RequestContextDelegate::NotifyCookieChange(
 | |
|     const net::CanonicalCookie& cookie,
 | |
|     net::CookieChangeCause cause) {
 | |
|   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 | |
| 
 | |
|   CookieDetails cookie_details(
 | |
|       &cookie, !(cause == net::CookieChangeCause::INSERTED), cause);
 | |
|   cookie_change_sub_list_.Notify(&cookie_details);
 | |
| }
 | |
| 
 | |
| std::unique_ptr<net::NetworkDelegate>
 | |
| RequestContextDelegate::CreateNetworkDelegate() {
 | |
|   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 | |
| 
 | |
|   return std::make_unique<AtomNetworkDelegate>();
 | |
| }
 | |
| 
 | |
| std::unique_ptr<net::URLRequestJobFactory>
 | |
| RequestContextDelegate::CreateURLRequestJobFactory(
 | |
|     net::URLRequestContext* url_request_context,
 | |
|     content::ProtocolHandlerMap* protocol_handlers) {
 | |
|   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 | |
| 
 | |
|   std::unique_ptr<AtomURLRequestJobFactory> job_factory(
 | |
|       new AtomURLRequestJobFactory);
 | |
| 
 | |
|   for (auto& it : *protocol_handlers) {
 | |
|     job_factory->SetProtocolHandler(it.first,
 | |
|                                     base::WrapUnique(it.second.release()));
 | |
|   }
 | |
|   protocol_handlers->clear();
 | |
| 
 | |
|   job_factory->SetProtocolHandler(url::kAboutScheme,
 | |
|                                   base::WrapUnique(new AboutProtocolHandler));
 | |
|   job_factory->SetProtocolHandler(
 | |
|       url::kDataScheme, base::WrapUnique(new net::DataProtocolHandler));
 | |
|   job_factory->SetProtocolHandler(
 | |
|       url::kFileScheme,
 | |
|       base::WrapUnique(
 | |
|           new asar::AsarProtocolHandler(base::CreateTaskRunnerWithTraits(
 | |
|               {base::MayBlock(), base::TaskPriority::USER_VISIBLE,
 | |
|                base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}))));
 | |
|   job_factory->SetProtocolHandler(
 | |
|       url::kHttpScheme,
 | |
|       base::WrapUnique(new HttpProtocolHandler(url::kHttpScheme)));
 | |
|   job_factory->SetProtocolHandler(
 | |
|       url::kHttpsScheme,
 | |
|       base::WrapUnique(new HttpProtocolHandler(url::kHttpsScheme)));
 | |
|   job_factory->SetProtocolHandler(
 | |
|       url::kWsScheme,
 | |
|       base::WrapUnique(new HttpProtocolHandler(url::kWsScheme)));
 | |
|   job_factory->SetProtocolHandler(
 | |
|       url::kWssScheme,
 | |
|       base::WrapUnique(new HttpProtocolHandler(url::kWssScheme)));
 | |
| 
 | |
|   auto* host_resolver = url_request_context->host_resolver();
 | |
|   job_factory->SetProtocolHandler(
 | |
|       url::kFtpScheme, net::FtpProtocolHandler::Create(host_resolver));
 | |
| 
 | |
|   return std::move(job_factory);
 | |
| }
 | |
| 
 | |
| net::HttpCache::BackendFactory*
 | |
| RequestContextDelegate::CreateHttpCacheBackendFactory(
 | |
|     const base::FilePath& base_path) {
 | |
|   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 | |
| 
 | |
|   base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
 | |
|   if (!use_cache_) {
 | |
|     return new NoCacheBackend;
 | |
|   } else {
 | |
|     int max_size = 0;
 | |
|     base::StringToInt(
 | |
|         command_line->GetSwitchValueASCII(switches::kDiskCacheSize), &max_size);
 | |
| 
 | |
|     base::FilePath cache_path = base_path.Append(FILE_PATH_LITERAL("Cache"));
 | |
|     return new net::HttpCache::DefaultBackend(
 | |
|         net::DISK_CACHE, net::CACHE_BACKEND_DEFAULT, cache_path, max_size);
 | |
|   }
 | |
| }
 | |
| 
 | |
| std::unique_ptr<net::CertVerifier> RequestContextDelegate::CreateCertVerifier(
 | |
|     brightray::RequireCTDelegate* ct_delegate) {
 | |
|   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 | |
| 
 | |
|   return std::make_unique<AtomCertVerifier>(ct_delegate);
 | |
| }
 | |
| 
 | |
| void RequestContextDelegate::GetCookieableSchemes(
 | |
|     std::vector<std::string>* cookie_schemes) {
 | |
|   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 | |
| 
 | |
|   const auto& standard_schemes = atom::api::GetStandardSchemes();
 | |
|   cookie_schemes->insert(cookie_schemes->end(), standard_schemes.begin(),
 | |
|                          standard_schemes.end());
 | |
| }
 | |
| 
 | |
| void RequestContextDelegate::OnCookieChanged(const net::CanonicalCookie& cookie,
 | |
|                                              net::CookieChangeCause cause) {
 | |
|   DCHECK_CURRENTLY_ON(BrowserThread::IO);
 | |
| 
 | |
|   BrowserThread::PostTask(
 | |
|       BrowserThread::UI, FROM_HERE,
 | |
|       base::BindRepeating(&RequestContextDelegate::NotifyCookieChange,
 | |
|                           weak_factory_.GetWeakPtr(), cookie, cause));
 | |
| }
 | |
| 
 | |
| }  // namespace atom
 |