// Copyright 2018 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef THIRD_PARTY_BLINK_PUBLIC_COMMON_LOADER_MIME_SNIFFING_URL_LOADER_H_ #define THIRD_PARTY_BLINK_PUBLIC_COMMON_LOADER_MIME_SNIFFING_URL_LOADER_H_ #include <tuple> #include "base/functional/callback.h" #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "base/task/sequenced_task_runner.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/system/data_pipe.h" #include "mojo/public/cpp/system/simple_watcher.h" #include "services/network/public/cpp/shared_url_loader_factory.h" #include "services/network/public/mojom/url_loader.mojom.h" #include "services/network/public/mojom/url_loader_factory.mojom-forward.h" #include "services/network/public/mojom/url_response_head.mojom-forward.h" #include "third_party/blink/public/common/common_export.h" #include "third_party/blink/public/common/loader/url_loader_throttle.h" namespace blink { class MimeSniffingThrottle; // Reads the response body and determines its mime type. This url loader buffers // the response body until the mime type is decided. MimeSniffingURLLoader // is expected to be created just after receiving OnReceiveResponse(), so this // handles only OnComplete() as a network::mojom::URLLoaderClient. // // This loader has five states: // kWaitForBody: The initial state until the body is received (= // OnReceiveResponse() is called) or the response is // finished (= OnComplete() is called). When body is provided, the // state is changed to kSniffing. Otherwise the state goes to // kCompleted. // kSniffing: Receives the body from the source loader and estimate the mime // type. The received body is kept in this loader until the mime type // is decided. When the mime type is decided or all body has been // received, this loader will dispatch queued messages to the // destination loader client, and then the state is changed to // kSending. // kSending: Receives the body and sends it to the destination loader client. // The state changes to kCompleted after all data is sent. // kCompleted: All data has been sent to the destination loader. // kAborted: Unexpected behavior happens. Watchers, pipes and the binding from // the source loader to |this| are stopped. All incoming messages from // the destination (through network::mojom::URLLoader) are ignored in // this state. class BLINK_COMMON_EXPORT MimeSniffingURLLoader : public network::mojom::URLLoaderClient, public network::mojom::URLLoader { … }; } // namespace blink #endif // THIRD_PARTY_BLINK_PUBLIC_COMMON_LOADER_MIME_SNIFFING_URL_LOADER_H_