chromium/chrome/services/cups_proxy/proxy_manager.h

// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_SERVICES_CUPS_PROXY_PROXY_MANAGER_H_
#define CHROME_SERVICES_CUPS_PROXY_PROXY_MANAGER_H_

#include <memory>
#include <string>
#include <vector>

#include "chrome/services/cups_proxy/public/mojom/proxy.mojom.h"
#include "chrome/services/ipp_parser/public/cpp/ipp_converter.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"

namespace cups_proxy {

class CupsProxyServiceDelegate;
class IppValidator;
class PrinterInstaller;
class SocketManager;

// mojom::CupsProxier handler.
//
// This handler's job is vetting incoming arbitrary CUPS IPP requests before
// they reach the CUPS Daemon. Requests are parsed out-of-process, by the
// CupsIppParser Service, and validated/rebuilt in-process before being proxied.
// This handler must be created/accessed from a sequenced context.
//
// Note: This handler only supports processing one request at a time; any
// concurrent requests will immediately fail with an empty response.
class ProxyManager : public mojom::CupsProxier {
 public:
  // Request rate limit per second.
  static constexpr int kRateLimit = 40;

  // Factory function.
  static std::unique_ptr<ProxyManager> Create(
      mojo::PendingReceiver<mojom::CupsProxier> request,
      std::unique_ptr<CupsProxyServiceDelegate> delegate);

  // Factory function that allows injected dependencies, for testing.
  static std::unique_ptr<ProxyManager> CreateForTesting(
      mojo::PendingReceiver<mojom::CupsProxier> request,
      std::unique_ptr<CupsProxyServiceDelegate> delegate,
      std::unique_ptr<IppValidator> ipp_validator,
      std::unique_ptr<PrinterInstaller> printer_installer,
      std::unique_ptr<SocketManager> socket_manager);

  ~ProxyManager() override = default;

  void ProxyRequest(const std::string& method,
                    const std::string& url,
                    const std::string& version,
                    const std::vector<ipp_converter::HttpHeader>& headers,
                    const std::vector<uint8_t>& body,
                    ProxyRequestCallback cb) override = 0;
};

}  // namespace cups_proxy

#endif  // CHROME_SERVICES_CUPS_PROXY_PROXY_MANAGER_H_