// Copyright 2014 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 MOJO_SERVICES_NETWORK_URL_LOADER_IMPL_H_
#define MOJO_SERVICES_NETWORK_URL_LOADER_IMPL_H_

#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "mojo/message_pump/handle_watcher.h"
#include "mojo/services/network/interfaces/url_loader.mojom.h"
#include "mojo/services/network/interfaces/network_service.mojom.h"
#include "net/base/net_errors.h"
#include "net/url_request/url_request.h"
#include "third_party/mojo/src/mojo/public/cpp/bindings/binding.h"

namespace mojo {

class NetworkContext;
class NetToMojoPendingBuffer;

class URLLoaderImpl : public URLLoader,
                      public net::URLRequest::Delegate {
 public:
  URLLoaderImpl(NetworkContext* context,
                InterfaceRequest<URLLoader> request,
                std::vector<URLLoaderInterceptorPtr> interceptors);
  ~URLLoaderImpl() override;

  // Called when the associated NetworkContext is going away.
  void Cleanup();

 private:
  class BodyFetcher;

  // URLLoader methods:
  void Start(URLRequestPtr request,
             const Callback<void(URLResponsePtr)>& callback) override;
  void FollowRedirect(const Callback<void(URLResponsePtr)>& callback) override;
  void QueryStatus(const Callback<void(URLLoaderStatusPtr)>& callback) override;

  // net::URLRequest::Delegate methods:
  void OnReceivedRedirect(net::URLRequest* url_request,
                          const net::RedirectInfo& redirect_info,
                          bool* defer_redirect) override;
  void OnResponseStarted(net::URLRequest* url_request) override;
  void OnReadCompleted(net::URLRequest* url_request, int bytes_read) override;

  void OnConnectionError();
  void SendError(
      int error,
      const Callback<void(URLResponsePtr)>& callback);
  void OnIntercept(URLLoaderInterceptorResponsePtr response);
  void FollowRedirectInternal();
  void StartInternal(URLRequestPtr request);
  void SendResponse(URLResponsePtr response);
  void OnBodyFetcherDone(BodyFetcher* fetcher);

  NetworkContext* context_;
  std::vector<URLLoaderInterceptorPtr> interceptors_;
  int interceptor_index_;
  Callback<void(URLResponsePtr)> callback_;
  scoped_ptr<net::URLRequest> url_request_;
  scoped_ptr<net::RedirectInfo> redirect_info_;
  uint32 response_body_buffer_size_;
  bool auto_follow_redirects_;
  std::vector<std::unique_ptr<BodyFetcher>> body_fetchers_;
  uint32_t current_fetcher_id_;
  URLLoaderStatusPtr last_status_;
  Binding<URLLoader> binding_;
};

}  // namespace mojo

#endif  // MOJO_SERVICES_NETWORK_URL_LOADER_IMPL_H_
