// 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/browser/loader/download_utils_impl.h"

#include "content/public/browser/content_browser_client.h"
#include "content/public/common/content_client.h"
#include "net/http/http_content_disposition.h"
#include "net/http/http_response_headers.h"
#include "third_party/blink/public/common/mime_util/mime_util.h"
#include "url/gurl.h"

namespace {

// Allow list to rendering mhtml.
const char* const kAllowListSchemesToRenderingMhtml[] = {
    url::kFileScheme,
#if defined(OS_ANDROID)
    url::kContentScheme,
#endif  // OS_ANDROID
};

// Determins whether given url would render the mhtml as html according to
// scheme.
bool ShouldAlwaysRenderMhtmlAsHtml(const GURL& url) {
  for (const char* scheme : kAllowListSchemesToRenderingMhtml) {
    if (url.SchemeIs(scheme))
      return true;
  }

  return false;
}

}  // namespace

namespace content {
namespace download_utils {

bool MustDownload(const GURL& url,
                  const net::HttpResponseHeaders* headers,
                  const std::string& mime_type) {
  if (headers) {
    std::string disposition;
    if (headers->GetNormalizedHeader("content-disposition", &disposition) &&
        !disposition.empty() &&
        net::HttpContentDisposition(disposition, std::string())
            .is_attachment()) {
      return true;
    }
    if (GetContentClient()->browser()->ShouldForceDownloadResource(url,
                                                                   mime_type))
      return true;
    if (mime_type == "multipart/related" || mime_type == "message/rfc822") {
      // Always allow rendering mhtml for content:// (on Android) and file:///.
      if (ShouldAlwaysRenderMhtmlAsHtml(url))
        return false;

      // TODO(https://crbug.com/790734): retrieve the new NavigationUIData from
      // the request and and pass it to AllowRenderingMhtmlOverHttp().
      return !GetContentClient()->browser()->AllowRenderingMhtmlOverHttp(
          nullptr);
    }
    // TODO(qinmin): Check whether this is special-case user script that needs
    // to be downloaded.
  }

  return false;
}

bool IsDownload(const GURL& url,
                const net::HttpResponseHeaders* headers,
                const std::string& mime_type) {
  if (MustDownload(url, headers, mime_type))
    return true;

  if (blink::IsSupportedMimeType(mime_type))
    return false;

  return !headers || headers->response_code() / 100 == 2;
}

}  // namespace download_utils
}  // namespace content
