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

#include <set>
#include <string>

#include "base/macros.h"
#include "base/memory/scoped_ptr.h"
#include "mojo/services/network/interfaces/http_connection.mojom.h"
#include "mojo/services/network/interfaces/http_message.mojom.h"
#include "third_party/mojo/src/mojo/public/cpp/bindings/binding.h"

namespace net {
class HttpServerRequestInfo;
}

namespace mojo {

class HttpServerImpl;

class HttpConnectionImpl : public HttpConnection {
 public:
  // |server| must outlive this object.
  HttpConnectionImpl(int connection_id,
                     HttpServerImpl* server,
                     HttpConnectionDelegatePtr delegate,
                     HttpConnectionPtr* connection);

  ~HttpConnectionImpl() override;

  void OnReceivedHttpRequest(const net::HttpServerRequestInfo& info);
  void OnReceivedWebSocketRequest(const net::HttpServerRequestInfo& info);
  void OnReceivedWebSocketMessage(const std::string& data);

 private:
  class SimpleDataPipeReader;
  class WebSocketImpl;

  // HttpConnection implementation.
  void SetSendBufferSize(uint32_t size,
                         const SetSendBufferSizeCallback& callback) override;
  void SetReceiveBufferSize(
      uint32_t size,
      const SetReceiveBufferSizeCallback& callback) override;

  void OnFinishedReadingResponseBody(HttpResponsePtr response_ptr,
                                     SimpleDataPipeReader* reader,
                                     scoped_ptr<std::string> body);

  void Close();

  // Checks whether Close() has been called.
  bool IsClosing() const { return !binding_.is_bound(); }

  // Checks whether all wrap-up work has been done during the closing process.
  // If yes, notifies the owner, which may result in the destruction of this
  // object.
  void NotifyOwnerCloseIfAllDone();

  void OnWebSocketClosed();

  const int connection_id_;
  HttpServerImpl* const server_;
  HttpConnectionDelegatePtr delegate_;
  Binding<HttpConnection> binding_;
  // Owns its elements.
  std::set<SimpleDataPipeReader*> response_body_readers_;

  scoped_ptr<WebSocketImpl> web_socket_;

  DISALLOW_COPY_AND_ASSIGN(HttpConnectionImpl);
};

}  // namespace mojo

#endif  // MOJO_SERVICES_NETWORK_HTTP_CONNECTION_IMPL_H_
