| // Copyright 2018 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "content/common/mime_sniffing_throttle.h" |
| |
| #include "content/common/mime_sniffing_url_loader.h" |
| #include "net/base/mime_sniffer.h" |
| |
| namespace content { |
| |
| MimeSniffingThrottle::MimeSniffingThrottle( |
| scoped_refptr<base::SingleThreadTaskRunner> task_runner) |
| : task_runner_(std::move(task_runner)), weak_factory_(this) {} |
| |
| MimeSniffingThrottle::~MimeSniffingThrottle() = default; |
| |
| void MimeSniffingThrottle::WillProcessResponse( |
| const GURL& response_url, |
| network::ResourceResponseHead* response_head, |
| bool* defer) { |
| // No need to do mime sniffing again. |
| if (response_head->did_mime_sniff) |
| return; |
| |
| bool blocked_sniffing_mime = false; |
| std::string content_type_options; |
| if (response_head->headers && |
| response_head->headers->GetNormalizedHeader("x-content-type-options", |
| &content_type_options)) { |
| blocked_sniffing_mime = |
| base::LowerCaseEqualsASCII(content_type_options, "nosniff"); |
| } |
| |
| if (!blocked_sniffing_mime && |
| net::ShouldSniffMimeType(response_url, response_head->mime_type)) { |
| // Pause the response until the mime type becomes ready. |
| *defer = true; |
| |
| network::mojom::URLLoaderPtr new_loader; |
| network::mojom::URLLoaderClientRequest new_loader_request; |
| network::mojom::URLLoaderPtr source_loader; |
| network::mojom::URLLoaderClientRequest source_client_request; |
| MimeSniffingURLLoader* mime_sniffing_loader; |
| std::tie(new_loader, new_loader_request, mime_sniffing_loader) = |
| MimeSniffingURLLoader::CreateLoader(weak_factory_.GetWeakPtr(), |
| response_url, *response_head, |
| task_runner_); |
| delegate_->InterceptResponse(std::move(new_loader), |
| std::move(new_loader_request), &source_loader, |
| &source_client_request); |
| mime_sniffing_loader->Start(std::move(source_loader), |
| std::move(source_client_request)); |
| } |
| } |
| |
| void MimeSniffingThrottle::ResumeWithNewResponseHead( |
| const network::ResourceResponseHead& new_response_head) { |
| delegate_->UpdateDeferredResponseHead(new_response_head); |
| delegate_->Resume(); |
| } |
| |
| } // namespace content |