web_socket_encoder.h 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. // Copyright 2014 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #ifndef NET_SERVER_WEB_SOCKET_ENCODER_H_
  5. #define NET_SERVER_WEB_SOCKET_ENCODER_H_
  6. #include <memory>
  7. #include <string>
  8. #include <vector>
  9. #include "base/strings/string_piece.h"
  10. #include "net/server/web_socket.h"
  11. #include "net/websockets/websocket_deflater.h"
  12. #include "net/websockets/websocket_inflater.h"
  13. namespace net {
  14. class WebSocketDeflateParameters;
  15. class WebSocketEncoder final {
  16. public:
  17. static const char kClientExtensions[];
  18. WebSocketEncoder(const WebSocketEncoder&) = delete;
  19. WebSocketEncoder& operator=(const WebSocketEncoder&) = delete;
  20. ~WebSocketEncoder();
  21. // Creates and returns an encoder for a server without extensions.
  22. static std::unique_ptr<WebSocketEncoder> CreateServer();
  23. // Creates and returns an encoder.
  24. // |extensions| is the value of a Sec-WebSocket-Extensions header.
  25. // Returns nullptr when there is an error.
  26. static std::unique_ptr<WebSocketEncoder> CreateServer(
  27. const std::string& extensions,
  28. WebSocketDeflateParameters* params);
  29. static std::unique_ptr<WebSocketEncoder> CreateClient(
  30. const std::string& response_extensions);
  31. WebSocket::ParseResult DecodeFrame(const base::StringPiece& frame,
  32. int* bytes_consumed,
  33. std::string* output);
  34. void EncodeTextFrame(base::StringPiece frame,
  35. int masking_key,
  36. std::string* output);
  37. void EncodePongFrame(base::StringPiece frame,
  38. int masking_key,
  39. std::string* output);
  40. bool deflate_enabled() const { return !!deflater_; }
  41. private:
  42. enum Type {
  43. FOR_SERVER,
  44. FOR_CLIENT,
  45. };
  46. WebSocketEncoder(Type type,
  47. std::unique_ptr<WebSocketDeflater> deflater,
  48. std::unique_ptr<WebSocketInflater> inflater);
  49. std::vector<std::string> continuation_message_frames_;
  50. bool is_current_message_compressed_ = false;
  51. bool Inflate(std::string* message);
  52. bool Deflate(base::StringPiece message, std::string* output);
  53. Type type_;
  54. std::unique_ptr<WebSocketDeflater> deflater_;
  55. std::unique_ptr<WebSocketInflater> inflater_;
  56. };
  57. } // namespace net
  58. #endif // NET_SERVER_WEB_SOCKET_ENCODER_H_