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

#ifndef NET_SERVER_WEB_SOCKET_ENCODER_H_
#define NET_SERVER_WEB_SOCKET_ENCODER_H_

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

#include "base/strings/string_piece.h"
#include "net/server/web_socket.h"
#include "net/websockets/websocket_deflater.h"
#include "net/websockets/websocket_inflater.h"

namespace net {

class WebSocketDeflateParameters;

class WebSocketEncoder final {
 public:
  static const char kClientExtensions[];

  WebSocketEncoder(const WebSocketEncoder&) = delete;
  WebSocketEncoder& operator=(const WebSocketEncoder&) = delete;

  ~WebSocketEncoder();

  // Creates and returns an encoder for a server without extensions.
  static std::unique_ptr<WebSocketEncoder> CreateServer();
  // Creates and returns an encoder.
  // |extensions| is the value of a Sec-WebSocket-Extensions header.
  // Returns nullptr when there is an error.
  static std::unique_ptr<WebSocketEncoder> CreateServer(
      const std::string& extensions,
      WebSocketDeflateParameters* params);
  static std::unique_ptr<WebSocketEncoder> CreateClient(
      const std::string& response_extensions);

  WebSocket::ParseResult DecodeFrame(base::StringPiece frame,
                                     int* bytes_consumed,
                                     std::string* output);
  void EncodeTextFrame(base::StringPiece frame,
                       int masking_key,
                       std::string* output);
  void EncodePongFrame(base::StringPiece frame,
                       int masking_key,
                       std::string* output);

  bool deflate_enabled() const { return !!deflater_; }

 private:
  enum Type {
    FOR_SERVER,
    FOR_CLIENT,
  };

  WebSocketEncoder(Type type,
                   std::unique_ptr<WebSocketDeflater> deflater,
                   std::unique_ptr<WebSocketInflater> inflater);

  std::vector<std::string> continuation_message_frames_;
  bool is_current_message_compressed_ = false;

  bool Inflate(std::string* message);
  bool Deflate(base::StringPiece message, std::string* output);

  Type type_;
  std::unique_ptr<WebSocketDeflater> deflater_;
  std::unique_ptr<WebSocketInflater> inflater_;
};

}  // namespace net

#endif  // NET_SERVER_WEB_SOCKET_ENCODER_H_
