// 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 GARNET_BIN_HTTP_HTTP_URL_LOADER_IMPL_H_
#define GARNET_BIN_HTTP_HTTP_URL_LOADER_IMPL_H_

#include <fuchsia/net/oldhttp/cpp/fidl.h>

#include <lib/fit/function.h>
#include "lib/fidl/cpp/binding.h"
#include "src/lib/url/gurl.h"

namespace http {

class URLLoaderImpl : public ::fuchsia::net::oldhttp::URLLoader {
 public:
  // Coordinates requests to limit the number of concurrent active requests.
  class Coordinator {
   public:
    virtual ~Coordinator() {}
    virtual void RequestNetworkSlot(fit::function<void(fit::closure)> slot_request) = 0;
  };

  URLLoaderImpl(Coordinator* coordinator);
  ~URLLoaderImpl() override;

 private:
  template <typename T>
  class HTTPClient;

  using Callback = fit::function<void(::fuchsia::net::oldhttp::URLResponse)>;

  // URLLoader methods:
  void Start(::fuchsia::net::oldhttp::URLRequest request, StartCallback callback) override;
  void FollowRedirect(FollowRedirectCallback callback) override;
  void QueryStatus(QueryStatusCallback callback) override;

  void SendError(int error_code);
  void FollowRedirectInternal();
  void SendResponse(::fuchsia::net::oldhttp::URLResponse response);
  void StartInternal(::fuchsia::net::oldhttp::URLRequest request);

  Coordinator* coordinator_;
  Callback callback_;
  ::fuchsia::net::oldhttp::ResponseBodyMode response_body_mode_;
  // bool auto_follow_redirects_;
  url::GURL current_url_;
  ::fuchsia::net::oldhttp::URLLoaderStatus last_status_;
};

}  // namespace http

#endif  // GARNET_BIN_HTTP_HTTP_URL_LOADER_IMPL_H_
