text: //
  // Copyright (c) 2016-2017 Vinnie Falco (vinnie dot falco at gmail dot com)
  //
  // Distributed under the Boost Software License, Version 1.0. (See accompanying
  // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  //
  // Official repository: https://github.com/boostorg/beast
  //
  
  #ifndef BOOST_BEAST_WEBSOCKET_ERROR_HPP
  #define BOOST_BEAST_WEBSOCKET_ERROR_HPP
  
  #include <boost/beast/websocket/detail/error.hpp>
  #include <boost/beast/core/detail/config.hpp>
  #include <boost/beast/core/error.hpp>
  
  namespace boost {
  namespace beast {
  namespace websocket {
  
  /// Error codes returned from @ref beast::websocket::stream operations.
  enum class error
  {
      /** The WebSocket stream was gracefully closed at both endpoints
      */
      closed = 1,
  
  /*  The error codes error::failed and error::handshake_failed
      are no longer in use. Please change your code to compare values
      of type error_code against condition::handshake_failed
      and condition::protocol_violation instead.
              
      Apologies for the inconvenience.
  
      - VFALCO
  */
  #if ! BOOST_BEAST_DOXYGEN
      unused1 = 2, // failed
      unused2 = 3, // handshake_failed
  #endif
  
      /** The WebSocket operation caused a dynamic buffer overflow
      */
      buffer_overflow,
  
      /** The WebSocket stream produced an incomplete deflate block
      */
      partial_deflate_block,
  
      /** The WebSocket message  exceeded the locally configured limit
      */
      message_too_big,
  
      //
      // Handshake failure errors
      //
      // These will compare equal to condition::handshake_failed
      //
  
      /** The WebSocket handshake was not HTTP/1.1
  
          Error codes with this value will compare equal to @ref condition::handshake_failed
      */
      bad_http_version,
  
      /** The WebSocket handshake method was not GET
  
          Error codes with this value will compare equal to @ref condition::handshake_failed
      */
      bad_method,
  
      /** The WebSocket handshake Host field is missing
  
          Error codes with this value will compare equal to @ref condition::handshake_failed
      */
      no_host,
  
      /** The WebSocket handshake Connection field is missing
  
          Error codes with this value will compare equal to @ref condition::handshake_failed
      */
      no_connection,
  
      /** The WebSocket handshake Connection field is missing the upgrade token
  
          Error codes with this value will compare equal to @ref condition::handshake_failed
      */
      no_connection_upgrade,
  
      /** The WebSocket handshake Upgrade field is missing
  
          Error codes with this value will compare equal to @ref condition::handshake_failed
      */
      no_upgrade,
  
      /** The WebSocket handshake Upgrade field is missing the websocket token
  
          Error codes with this value will compare equal to @ref condition::handshake_failed
      */
      no_upgrade_websocket,
  
      /** The WebSocket handshake Sec-WebSocket-Key field is missing
  
          Error codes with this value will compare equal to @ref condition::handshake_failed
      */
      no_sec_key,
  
      /** The WebSocket handshake Sec-WebSocket-Key field is invalid
  
          Error codes with this value will compare equal to @ref condition::handshake_failed
      */
      bad_sec_key,
  
      /** The WebSocket handshake Sec-WebSocket-Version field is missing
  
          Error codes with this value will compare equal to @ref condition::handshake_failed
      */
      no_sec_version,
  
      /** The WebSocket handshake Sec-WebSocket-Version field is invalid
  
          Error codes with this value will compare equal to @ref condition::handshake_failed
      */
      bad_sec_version,
  
      /** The WebSocket handshake Sec-WebSocket-Accept field is missing
  
          Error codes with this value will compare equal to @ref condition::handshake_failed
      */
      no_sec_accept,
  
      /** The WebSocket handshake Sec-WebSocket-Accept field is invalid
  
          Error codes with this value will compare equal to @ref condition::handshake_failed
      */
      bad_sec_accept,
  
      /** The WebSocket handshake was declined by the remote peer
  
          Error codes with this value will compare equal to @ref condition::handshake_failed
      */
      upgrade_declined,
  
      //
      // Protocol errors
      //
      // These will compare equal to condition::protocol_violation
      //
  
      /** The WebSocket frame contained an illegal opcode
  
          Error codes with this value will compare equal to @ref condition::protocol_violation
      */
      bad_opcode,
  
      /** The WebSocket data frame was unexpected
  
          Error codes with this value will compare equal to @ref condition::protocol_violation
      */
      bad_data_frame,
  
      /** The WebSocket continuation frame was unexpected
  
          Error codes with this value will compare equal to @ref condition::protocol_violation
      */
      bad_continuation,
  
      /** The WebSocket frame contained illegal reserved bits
  
          Error codes with this value will compare equal to @ref condition::protocol_violation
      */
      bad_reserved_bits,
  
      /** The WebSocket control frame was fragmented
  
          Error codes with this value will compare equal to @ref condition::protocol_violation
      */
      bad_control_fragment,
  
      /** The WebSocket control frame size was invalid
  
          Error codes with this value will compare equal to @ref condition::protocol_violation
      */
      bad_control_size,
  
      /** The WebSocket frame was unmasked
  
          Error codes with this value will compare equal to @ref condition::protocol_violation
      */
      bad_unmasked_frame,
  
      /** The WebSocket frame was masked
  
          Error codes with this value will compare equal to @ref condition::protocol_violation
      */
      bad_masked_frame,
  
      /** The WebSocket frame size was not canonical
  
          Error codes with this value will compare equal to @ref condition::protocol_violation
      */
      bad_size,
  
      /** The WebSocket frame payload was not valid utf8
  
          Error codes with this value will compare equal to @ref condition::protocol_violation
      */
      bad_frame_payload,
  
      /** The WebSocket close frame reason code was invalid
  
          Error codes with this value will compare equal to @ref condition::protocol_violation
      */
      bad_close_code,
  
      /** The WebSocket close frame payload size was invalid
  
          Error codes with this value will compare equal to @ref condition::protocol_violation
      */
      bad_close_size,
  
      /** The WebSocket close frame payload was not valid utf8
  
          Error codes with this value will compare equal to @ref condition::protocol_violation
      */
      bad_close_payload
  };
  
  /// Error conditions corresponding to sets of error codes.
  enum class condition
  {
      /** The WebSocket handshake failed
  
          This condition indicates that the WebSocket handshake failed. If
          the corresponding HTTP response indicates the keep-alive behavior,
          then the handshake may be reattempted.
      */
      handshake_failed = 1,
  
      /** A WebSocket protocol violation occurred
  
          This condition indicates that the remote peer on the WebSocket
          connection sent data which violated the protocol.
      */
      protocol_violation
   };
  
  } // websocket
  } // beast
  } // boost
  
  #include <boost/beast/websocket/impl/error.ipp>
  
  #endif
  