// Copyright 2015 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.

#ifndef SHELL_APPLICATION_MANAGER_FETCHER_H_
#define SHELL_APPLICATION_MANAGER_FETCHER_H_

#include "base/callback.h"
#include "base/memory/scoped_ptr.h"

#include "mojo/services/network/public/interfaces/url_loader.mojom.h"

class GURL;

namespace base {
class FilePath;
class TaskRunner;
}

namespace shell {

// Fetcher abstracts getting an application by either file or http[s] URL.
//
// Although it is possible to use the Network implementation for http[s] URLs
// (because the underlying net library knows how to handle them), it is
// extremely slow because network responses must be copied to disk in order to
// get a file handle we can use with dlopen.
//
// Until this is solved, we use two different implementations so that
// performance isn't completely absymal.
class Fetcher {
 public:
  // The param will be null in the case where the content could not be fetched.
  // Reasons include:
  // - network error
  // - 4x or 5x HTTP errors
  typedef base::Callback<void(scoped_ptr<Fetcher>)> FetchCallback;

  Fetcher(const FetchCallback& fetch_callback);
  virtual ~Fetcher();

  // Returns the original URL that was fetched.
  virtual const GURL& GetURL() const = 0;

  // If the fetch resulted in a redirect, this returns the final URL after all
  // redirects. Otherwise, it returns an empty URL.
  virtual GURL GetRedirectURL() const = 0;

  virtual mojo::URLResponsePtr AsURLResponse(base::TaskRunner* task_runner,
                                             uint32_t skip) = 0;

  virtual void AsPath(
      base::TaskRunner* task_runner,
      base::Callback<void(const base::FilePath&, bool)> callback) = 0;

  virtual std::string MimeType() = 0;

  virtual bool HasMojoMagic() = 0;

  virtual bool PeekFirstLine(std::string* line) = 0;

  bool PeekContentHandler(std::string* mojo_shebang,
                          GURL* mojo_content_handler_url);

 protected:
  static bool HasMojoMagic(const base::FilePath& path);
  static bool PeekFirstLine(const base::FilePath& path, std::string* line);

  FetchCallback loader_callback_;
};

}  // namespace shell

#endif  // SHELL_APPLICATION_MANAGER_FETCHER_H_
