1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 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_H_ 6*6777b538SAndroid Build Coastguard Worker #define NET_SERVER_WEB_SOCKET_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 12*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h" 13*6777b538SAndroid Build Coastguard Worker #include "net/traffic_annotation/network_traffic_annotation.h" 14*6777b538SAndroid Build Coastguard Worker #include "net/websockets/websocket_frame.h" 15*6777b538SAndroid Build Coastguard Worker 16*6777b538SAndroid Build Coastguard Worker namespace net { 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Worker class HttpConnection; 19*6777b538SAndroid Build Coastguard Worker class HttpServer; 20*6777b538SAndroid Build Coastguard Worker class HttpServerRequestInfo; 21*6777b538SAndroid Build Coastguard Worker class WebSocketEncoder; 22*6777b538SAndroid Build Coastguard Worker 23*6777b538SAndroid Build Coastguard Worker class WebSocket final { 24*6777b538SAndroid Build Coastguard Worker public: 25*6777b538SAndroid Build Coastguard Worker enum ParseResult { 26*6777b538SAndroid Build Coastguard Worker // Final frame of a text message or compressed frame. 27*6777b538SAndroid Build Coastguard Worker FRAME_OK_FINAL, 28*6777b538SAndroid Build Coastguard Worker // Other frame of a text message. 29*6777b538SAndroid Build Coastguard Worker FRAME_OK_MIDDLE, 30*6777b538SAndroid Build Coastguard Worker FRAME_PING, 31*6777b538SAndroid Build Coastguard Worker FRAME_PONG, 32*6777b538SAndroid Build Coastguard Worker FRAME_INCOMPLETE, 33*6777b538SAndroid Build Coastguard Worker FRAME_CLOSE, 34*6777b538SAndroid Build Coastguard Worker FRAME_ERROR 35*6777b538SAndroid Build Coastguard Worker }; 36*6777b538SAndroid Build Coastguard Worker 37*6777b538SAndroid Build Coastguard Worker WebSocket(HttpServer* server, HttpConnection* connection); 38*6777b538SAndroid Build Coastguard Worker 39*6777b538SAndroid Build Coastguard Worker void Accept(const HttpServerRequestInfo& request, 40*6777b538SAndroid Build Coastguard Worker const NetworkTrafficAnnotationTag traffic_annotation); 41*6777b538SAndroid Build Coastguard Worker ParseResult Read(std::string* message); 42*6777b538SAndroid Build Coastguard Worker void Send(std::string_view message, 43*6777b538SAndroid Build Coastguard Worker WebSocketFrameHeader::OpCodeEnum op_code, 44*6777b538SAndroid Build Coastguard Worker const NetworkTrafficAnnotationTag traffic_annotation); 45*6777b538SAndroid Build Coastguard Worker 46*6777b538SAndroid Build Coastguard Worker WebSocket(const WebSocket&) = delete; 47*6777b538SAndroid Build Coastguard Worker WebSocket& operator=(const WebSocket&) = delete; 48*6777b538SAndroid Build Coastguard Worker 49*6777b538SAndroid Build Coastguard Worker ~WebSocket(); 50*6777b538SAndroid Build Coastguard Worker 51*6777b538SAndroid Build Coastguard Worker private: 52*6777b538SAndroid Build Coastguard Worker void Fail(); 53*6777b538SAndroid Build Coastguard Worker void SendErrorResponse(const std::string& message, 54*6777b538SAndroid Build Coastguard Worker const NetworkTrafficAnnotationTag traffic_annotation); 55*6777b538SAndroid Build Coastguard Worker 56*6777b538SAndroid Build Coastguard Worker // This dangling raw_ptr occurred in: 57*6777b538SAndroid Build Coastguard Worker // browser_tests: PortForwardingDisconnectTest.DisconnectOnRelease 58*6777b538SAndroid Build Coastguard Worker // https://ci.chromium.org/ui/p/chromium/builders/try/win-rel/170974/test-results?q=ExactID%3Aninja%3A%2F%2Fchrome%2Ftest%3Abrowser_tests%2FPortForwardingDisconnectTest.DisconnectOnRelease+VHash%3Abdbee181b3e0309b 59*6777b538SAndroid Build Coastguard Worker const raw_ptr<HttpServer, 60*6777b538SAndroid Build Coastguard Worker AcrossTasksDanglingUntriaged | FlakyDanglingUntriaged> 61*6777b538SAndroid Build Coastguard Worker server_; 62*6777b538SAndroid Build Coastguard Worker const raw_ptr<HttpConnection> connection_; 63*6777b538SAndroid Build Coastguard Worker std::unique_ptr<WebSocketEncoder> encoder_; 64*6777b538SAndroid Build Coastguard Worker bool closed_ = false; 65*6777b538SAndroid Build Coastguard Worker std::unique_ptr<NetworkTrafficAnnotationTag> traffic_annotation_ = nullptr; 66*6777b538SAndroid Build Coastguard Worker }; 67*6777b538SAndroid Build Coastguard Worker 68*6777b538SAndroid Build Coastguard Worker } // namespace net 69*6777b538SAndroid Build Coastguard Worker 70*6777b538SAndroid Build Coastguard Worker #endif // NET_SERVER_WEB_SOCKET_H_ 71