// 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 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") {
      // 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
