text: // Copyright 2014 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 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(const 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_
  