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