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