910e62b5创建于 1月15日历史提交
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_DOWNLOAD_PUBLIC_COMMON_DOWNLOAD_CREATE_INFO_H_
#define COMPONENTS_DOWNLOAD_PUBLIC_COMMON_DOWNLOAD_CREATE_INFO_H_

#include <stdint.h>

#include <optional>
#include <string>
#include <vector>

#include "base/memory/scoped_refptr.h"
#include "base/time/time.h"
#include "components/download/public/common/download_export.h"
#include "components/download/public/common/download_interrupt_reasons.h"
#include "components/download/public/common/download_item.h"
#include "components/download/public/common/download_save_info.h"
#include "components/download/public/common/download_source.h"
#include "components/download/public/common/download_url_parameters.h"
#include "net/http/http_connection_info.h"
#include "net/url_request/referrer_policy.h"
#include "services/metrics/public/cpp/ukm_source_id.h"
#include "services/network/public/mojom/fetch_api.mojom-shared.h"
#include "ui/base/page_transition_types.h"
#include "url/gurl.h"
#include "url/origin.h"

namespace net {
class HttpResponseHeaders;
}

namespace download {
// Server support for range request inferred from the response headers.
// |kSupport| value means the server supports range requests. |kNoSupport|
// means no range request is accepted by server. and |kUnknown| is used if
// range request support cannot be inferred from response headers.
enum class RangeRequestSupportType {
  kSupport = 0,
  kUnknown,
  kNoSupport,
};

// Used for informing the download manager of a new download, since we don't
// want to pass |DownloadItem|s between threads.
struct COMPONENTS_DOWNLOAD_EXPORT DownloadCreateInfo {
  DownloadCreateInfo(const base::Time& start_time,
                     std::unique_ptr<DownloadSaveInfo> save_info);
  DownloadCreateInfo();

  DownloadCreateInfo(const DownloadCreateInfo&) = delete;
  DownloadCreateInfo& operator=(const DownloadCreateInfo&) = delete;

  ~DownloadCreateInfo();

  bool is_new_download;

  // The URL from which we are downloading. This is the final URL after any
  // redirection by the server for |url_chain|.
  const GURL& url() const;

  // The unique identifier for the download.
  std::string guid;

  // The chain of redirects that leading up to and including the final URL.
  std::vector<GURL> url_chain;

  // The URL and referrer policy that referred us.
  GURL referrer_url;
  net::ReferrerPolicy referrer_policy;

  // The serialized embedder download data for the site instance that initiated
  // the download.
  std::string serialized_embedder_download_data;

  // The URL of the tab that started us.
  GURL tab_url;

  // The referrer URL of the tab that started us.
  GURL tab_referrer_url;

  // The origin of the requester that originally initiated the download.
  std::optional<url::Origin> request_initiator;

  // The time when the download started.
  base::Time start_time;

  // The size of the response body. If content-length response header is not
  // presented or can't be parse, set to 0.
  int64_t total_bytes;

  // The starting position of the initial request.
  // This value matches the offset in DownloadSaveInfo.
  // TODO(xingliu): Refactor to remove |offset| and |length|.
  int64_t offset;

  // True if the download was initiated by user action.
  bool has_user_gesture;

  // Whether the download should be transient. A transient download is
  // short-lived and is not shown in the UI.
  bool transient;

  // Whether this download requires safety checks.
  bool require_safety_checks;

  std::optional<ui::PageTransition> transition_type;

  // The HTTP response headers. This contains a nullptr when the response has
  // not yet been received. Only for consuming headers.
  scoped_refptr<const net::HttpResponseHeaders> response_headers;

  // The remote IP address where the download was fetched from.  Copied from
  // UrlRequest::GetSocketAddress().
  std::string remote_address;

  // If the download is initially created in an interrupted state (because the
  // response was in error), then |result| would be something other than
  // INTERRUPT_REASON_NONE.
  DownloadInterruptReason result;

  // The download file save info.
  std::unique_ptr<DownloadSaveInfo> save_info;

  // The render process id that initiates this download.
  int render_process_id;

  // The render frame id that initiates this download.
  int render_frame_id;

  // ---------------------------------------------------------------------------
  // The remaining fields are Entity-body properties. These are only set if
  // |result| is DOWNLOAD_INTERRUPT_REASON_NONE.
  // ---------------------------------------------------------------------------

  // The content-disposition string from the response header.
  std::string content_disposition;

  // The mime type string from the response header (may be overridden).
  std::string mime_type;

  // The value of the content type header sent with the downloaded item.  It
  // may be different from |mime_type|, which may be set based on heuristics
  // which may look at the file extension and first few bytes of the file.
  std::string original_mime_type;

  // For continuing a download, the modification time of the file.
  // Storing as a string for exact match to server format on
  // "If-Unmodified-Since" comparison.
  std::string last_modified;

  // For continuing a download, the ETag of the file.
  std::string etag;

  // Whether the server supports range requests.
  RangeRequestSupportType accept_range;

  // The HTTP connection type.
  net::HttpConnectionInfo connection_info;

  // The HTTP request method.
  std::string method;

  // Whether the download should fetch the response body for non successful HTTP
  // response.
  bool fetch_error_body = false;

  // The request headers that has been sent in the download request.
  DownloadUrlParameters::RequestHeadersType request_headers;

  // Source ID generated for UKM.
  ukm::SourceId ukm_source_id;

  // For downloads originating from custom tabs, this records the origin
  // of the custom tab.
  std::string request_origin;

  // Source of the download, used in metrics.
  DownloadSource download_source = DownloadSource::UNKNOWN;

  // Whether download is initiated by the content on the page.
  bool is_content_initiated;

  // The credentials mode for whether to expose the response headers to
  // javascript, see Access-Control-Allow-Credentials header.
  ::network::mojom::CredentialsMode credentials_mode;

  // Isolation info for the download request, mainly for same site cookies.
  std::optional<net::IsolationInfo> isolation_info;

#if BUILDFLAG(IS_ANDROID)
  // Whether the original URL may allow auto open after download completion.
  // Some download, such as those from context menu or download service, or has
  // "attachment" in content-disposition, will disallow auto-open after
  // completion.
  bool allow_auto_open_after_completion = true;
#endif  // BUILDFLAG(IS_ANDROID)
};

}  // namespace download

#endif  // COMPONENTS_DOWNLOAD_PUBLIC_COMMON_DOWNLOAD_CREATE_INFO_H_