websockets_endpoint.hpp 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #pragma once
  2. #include <tiny_websockets/internals/ws_common.hpp>
  3. #include <tiny_websockets/network/tcp_client.hpp>
  4. #include <tiny_websockets/internals/data_frame.hpp>
  5. #include <tiny_websockets/message.hpp>
  6. #include <memory>
  7. #define __TINY_WS_INTERNAL_DEFAULT_MASK "\00\00\00\00"
  8. namespace websockets {
  9. enum FragmentsPolicy {
  10. FragmentsPolicy_Aggregate,
  11. FragmentsPolicy_Notify
  12. };
  13. enum CloseReason {
  14. CloseReason_None = -1,
  15. CloseReason_NormalClosure = 1000,
  16. CloseReason_GoingAway = 1001,
  17. CloseReason_ProtocolError = 1002,
  18. CloseReason_UnsupportedData = 1003,
  19. CloseReason_NoStatusRcvd = 1005,
  20. CloseReason_AbnormalClosure = 1006,
  21. CloseReason_InvalidPayloadData = 1007,
  22. CloseReason_PolicyViolation = 1008,
  23. CloseReason_MessageTooBig = 1009,
  24. CloseReason_InternalServerError = 1011,
  25. };
  26. CloseReason GetCloseReason(uint16_t reasonCode);
  27. namespace internals {
  28. class WebsocketsEndpoint {
  29. public:
  30. WebsocketsEndpoint(std::shared_ptr<network::TcpClient> socket, FragmentsPolicy fragmentsPolicy = FragmentsPolicy_Aggregate);
  31. WebsocketsEndpoint(const WebsocketsEndpoint& other);
  32. WebsocketsEndpoint(const WebsocketsEndpoint&& other);
  33. WebsocketsEndpoint& operator=(const WebsocketsEndpoint& other);
  34. WebsocketsEndpoint& operator=(const WebsocketsEndpoint&& other);
  35. void setInternalSocket(std::shared_ptr<network::TcpClient> socket);
  36. bool poll();
  37. WebsocketsMessage recv();
  38. bool send(const char* data, const size_t len, const uint8_t opcode, const bool fin, const bool mask, const char* maskingKey = __TINY_WS_INTERNAL_DEFAULT_MASK);
  39. bool send(const WSString& data, const uint8_t opcode, const bool fin, const bool mask, const char* maskingKey = __TINY_WS_INTERNAL_DEFAULT_MASK);
  40. bool send(const char* data, const size_t len, const uint8_t opcode, const bool fin);
  41. bool send(const WSString& data, const uint8_t opcode, const bool fin);
  42. bool ping(const WSString& msg);
  43. bool ping(const WSString&& msg);
  44. bool pong(const WSString& msg);
  45. bool pong(const WSString&& msg);
  46. void close(const CloseReason reason = CloseReason_NormalClosure);
  47. CloseReason getCloseReason() const;
  48. void setFragmentsPolicy(const FragmentsPolicy newPolicy);
  49. FragmentsPolicy getFragmentsPolicy() const;
  50. void setUseMasking(bool useMasking) {
  51. _useMasking = useMasking;
  52. }
  53. virtual ~WebsocketsEndpoint();
  54. private:
  55. std::shared_ptr<network::TcpClient> _client;
  56. FragmentsPolicy _fragmentsPolicy;
  57. enum RecvMode {
  58. RecvMode_Normal,
  59. RecvMode_Streaming
  60. } _recvMode;
  61. WebsocketsMessage::StreamBuilder _streamBuilder;
  62. CloseReason _closeReason;
  63. bool _useMasking = true;
  64. WebsocketsFrame _recv();
  65. void handleMessageInternally(WebsocketsMessage& msg);
  66. WebsocketsMessage handleFrameInStreamingMode(WebsocketsFrame& frame);
  67. WebsocketsMessage handleFrameInStandardMode(WebsocketsFrame& frame);
  68. std::string getHeader(uint64_t len, uint8_t opcode, bool fin, bool mask);
  69. };
  70. }} // websockets::internals