// Copyright (c) 2012 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 QUICHE_QUIC_TOOLS_QUIC_TOY_SERVER_H_
#define QUICHE_QUIC_TOOLS_QUIC_TOY_SERVER_H_

#include "quic/core/crypto/proof_source.h"
#include "quic/tools/quic_simple_server_backend.h"
#include "quic/tools/quic_spdy_server_base.h"

namespace quic {

// A binary wrapper for QuicServer.  It listens forever on --port
// (default 6121) until it's killed or ctrl-cd to death.
class QuicToyServer {
 public:
  // A factory for creating QuicSpdyServerBase instances.
  class ServerFactory {
   public:
    virtual ~ServerFactory() = default;

    // Creates a QuicSpdyServerBase instance using |backend| for generating
    // responses, and |proof_source| for certificates.
    virtual std::unique_ptr<QuicSpdyServerBase> CreateServer(
        QuicSimpleServerBackend* backend,
        std::unique_ptr<ProofSource> proof_source,
        const ParsedQuicVersionVector& supported_versions) = 0;
  };

  // A facotry for creating QuicSimpleServerBackend instances.
  class BackendFactory {
   public:
    virtual ~BackendFactory() = default;

    // Creates a new backend.
    virtual std::unique_ptr<QuicSimpleServerBackend> CreateBackend() = 0;
  };

  // A factory for creating QuicMemoryCacheBackend instances, configured
  // to load files from disk, if necessary.
  class MemoryCacheBackendFactory : public BackendFactory {
   public:
    std::unique_ptr<quic::QuicSimpleServerBackend> CreateBackend() override;
  };

  // Constructs a new toy server that will use |server_factory| to create the
  // actual QuicSpdyServerBase instance.
  QuicToyServer(BackendFactory* backend_factory, ServerFactory* server_factory);

  // Connects to the QUIC server based on the various flags defined in the
  // .cc file, listends for requests and sends the responses. Returns 1 on
  // failure and does not return otherwise.
  int Start();

 private:
  BackendFactory* backend_factory_;  // Unowned.
  ServerFactory* server_factory_;    // Unowned.
};

}  // namespace quic

#endif  // QUICHE_QUIC_TOOLS_QUIC_TOY_SERVER_H_
