xref: /aosp_15_r20/external/cronet/net/server/web_socket.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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