xref: /aosp_15_r20/external/cronet/net/server/http_server.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_HTTP_SERVER_H_
6*6777b538SAndroid Build Coastguard Worker #define NET_SERVER_HTTP_SERVER_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
9*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker #include <map>
12*6777b538SAndroid Build Coastguard Worker #include <memory>
13*6777b538SAndroid Build Coastguard Worker #include <string>
14*6777b538SAndroid Build Coastguard Worker #include <string_view>
15*6777b538SAndroid Build Coastguard Worker 
16*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/memory/weak_ptr.h"
18*6777b538SAndroid Build Coastguard Worker #include "net/http/http_status_code.h"
19*6777b538SAndroid Build Coastguard Worker #include "net/traffic_annotation/network_traffic_annotation.h"
20*6777b538SAndroid Build Coastguard Worker 
21*6777b538SAndroid Build Coastguard Worker namespace net {
22*6777b538SAndroid Build Coastguard Worker 
23*6777b538SAndroid Build Coastguard Worker class HttpConnection;
24*6777b538SAndroid Build Coastguard Worker class HttpServerRequestInfo;
25*6777b538SAndroid Build Coastguard Worker class HttpServerResponseInfo;
26*6777b538SAndroid Build Coastguard Worker class IPEndPoint;
27*6777b538SAndroid Build Coastguard Worker class ServerSocket;
28*6777b538SAndroid Build Coastguard Worker class StreamSocket;
29*6777b538SAndroid Build Coastguard Worker 
30*6777b538SAndroid Build Coastguard Worker class HttpServer {
31*6777b538SAndroid Build Coastguard Worker  public:
32*6777b538SAndroid Build Coastguard Worker   // Delegate to handle http/websocket events. Beware that it is not safe to
33*6777b538SAndroid Build Coastguard Worker   // destroy the HttpServer in any of these callbacks.
34*6777b538SAndroid Build Coastguard Worker   class Delegate {
35*6777b538SAndroid Build Coastguard Worker    public:
36*6777b538SAndroid Build Coastguard Worker     virtual ~Delegate() = default;
37*6777b538SAndroid Build Coastguard Worker 
38*6777b538SAndroid Build Coastguard Worker     virtual void OnConnect(int connection_id) = 0;
39*6777b538SAndroid Build Coastguard Worker     virtual void OnHttpRequest(int connection_id,
40*6777b538SAndroid Build Coastguard Worker                                const HttpServerRequestInfo& info) = 0;
41*6777b538SAndroid Build Coastguard Worker     virtual void OnWebSocketRequest(int connection_id,
42*6777b538SAndroid Build Coastguard Worker                                     const HttpServerRequestInfo& info) = 0;
43*6777b538SAndroid Build Coastguard Worker     virtual void OnWebSocketMessage(int connection_id, std::string data) = 0;
44*6777b538SAndroid Build Coastguard Worker     virtual void OnClose(int connection_id) = 0;
45*6777b538SAndroid Build Coastguard Worker   };
46*6777b538SAndroid Build Coastguard Worker 
47*6777b538SAndroid Build Coastguard Worker   // Instantiates a http server with |server_socket| which already started
48*6777b538SAndroid Build Coastguard Worker   // listening, but not accepting.  This constructor schedules accepting
49*6777b538SAndroid Build Coastguard Worker   // connections asynchronously in case when |delegate| is not ready to get
50*6777b538SAndroid Build Coastguard Worker   // callbacks yet.
51*6777b538SAndroid Build Coastguard Worker   HttpServer(std::unique_ptr<ServerSocket> server_socket,
52*6777b538SAndroid Build Coastguard Worker              HttpServer::Delegate* delegate);
53*6777b538SAndroid Build Coastguard Worker 
54*6777b538SAndroid Build Coastguard Worker   HttpServer(const HttpServer&) = delete;
55*6777b538SAndroid Build Coastguard Worker   HttpServer& operator=(const HttpServer&) = delete;
56*6777b538SAndroid Build Coastguard Worker 
57*6777b538SAndroid Build Coastguard Worker   ~HttpServer();
58*6777b538SAndroid Build Coastguard Worker 
59*6777b538SAndroid Build Coastguard Worker   void AcceptWebSocket(int connection_id,
60*6777b538SAndroid Build Coastguard Worker                        const HttpServerRequestInfo& request,
61*6777b538SAndroid Build Coastguard Worker                        NetworkTrafficAnnotationTag traffic_annotation);
62*6777b538SAndroid Build Coastguard Worker   void SendOverWebSocket(int connection_id,
63*6777b538SAndroid Build Coastguard Worker                          std::string_view data,
64*6777b538SAndroid Build Coastguard Worker                          NetworkTrafficAnnotationTag traffic_annotation);
65*6777b538SAndroid Build Coastguard Worker   // Sends the provided data directly to the given connection. No validation is
66*6777b538SAndroid Build Coastguard Worker   // performed that data constitutes a valid HTTP response. A valid HTTP
67*6777b538SAndroid Build Coastguard Worker   // response may be split across multiple calls to SendRaw.
68*6777b538SAndroid Build Coastguard Worker   void SendRaw(int connection_id,
69*6777b538SAndroid Build Coastguard Worker                const std::string& data,
70*6777b538SAndroid Build Coastguard Worker                NetworkTrafficAnnotationTag traffic_annotation);
71*6777b538SAndroid Build Coastguard Worker   // TODO(byungchul): Consider replacing function name with SendResponseInfo
72*6777b538SAndroid Build Coastguard Worker   void SendResponse(int connection_id,
73*6777b538SAndroid Build Coastguard Worker                     const HttpServerResponseInfo& response,
74*6777b538SAndroid Build Coastguard Worker                     NetworkTrafficAnnotationTag traffic_annotation);
75*6777b538SAndroid Build Coastguard Worker   void Send(int connection_id,
76*6777b538SAndroid Build Coastguard Worker             HttpStatusCode status_code,
77*6777b538SAndroid Build Coastguard Worker             const std::string& data,
78*6777b538SAndroid Build Coastguard Worker             const std::string& mime_type,
79*6777b538SAndroid Build Coastguard Worker             NetworkTrafficAnnotationTag traffic_annotation);
80*6777b538SAndroid Build Coastguard Worker   void Send200(int connection_id,
81*6777b538SAndroid Build Coastguard Worker                const std::string& data,
82*6777b538SAndroid Build Coastguard Worker                const std::string& mime_type,
83*6777b538SAndroid Build Coastguard Worker                NetworkTrafficAnnotationTag traffic_annotation);
84*6777b538SAndroid Build Coastguard Worker   void Send404(int connection_id,
85*6777b538SAndroid Build Coastguard Worker                NetworkTrafficAnnotationTag traffic_annotation);
86*6777b538SAndroid Build Coastguard Worker   void Send500(int connection_id,
87*6777b538SAndroid Build Coastguard Worker                const std::string& message,
88*6777b538SAndroid Build Coastguard Worker                NetworkTrafficAnnotationTag traffic_annotation);
89*6777b538SAndroid Build Coastguard Worker 
90*6777b538SAndroid Build Coastguard Worker   void Close(int connection_id);
91*6777b538SAndroid Build Coastguard Worker 
92*6777b538SAndroid Build Coastguard Worker   void SetReceiveBufferSize(int connection_id, int32_t size);
93*6777b538SAndroid Build Coastguard Worker   void SetSendBufferSize(int connection_id, int32_t size);
94*6777b538SAndroid Build Coastguard Worker 
95*6777b538SAndroid Build Coastguard Worker   // Copies the local address to |address|. Returns a network error code.
96*6777b538SAndroid Build Coastguard Worker   int GetLocalAddress(IPEndPoint* address);
97*6777b538SAndroid Build Coastguard Worker 
98*6777b538SAndroid Build Coastguard Worker  private:
99*6777b538SAndroid Build Coastguard Worker   friend class HttpServerTest;
100*6777b538SAndroid Build Coastguard Worker 
101*6777b538SAndroid Build Coastguard Worker   void DoAcceptLoop();
102*6777b538SAndroid Build Coastguard Worker   void OnAcceptCompleted(int rv);
103*6777b538SAndroid Build Coastguard Worker   int HandleAcceptResult(int rv);
104*6777b538SAndroid Build Coastguard Worker 
105*6777b538SAndroid Build Coastguard Worker   void DoReadLoop(HttpConnection* connection);
106*6777b538SAndroid Build Coastguard Worker   void OnReadCompleted(int connection_id, int rv);
107*6777b538SAndroid Build Coastguard Worker   int HandleReadResult(HttpConnection* connection, int rv);
108*6777b538SAndroid Build Coastguard Worker 
109*6777b538SAndroid Build Coastguard Worker   void DoWriteLoop(HttpConnection* connection,
110*6777b538SAndroid Build Coastguard Worker                    NetworkTrafficAnnotationTag traffic_annotation);
111*6777b538SAndroid Build Coastguard Worker   void OnWriteCompleted(int connection_id,
112*6777b538SAndroid Build Coastguard Worker                         NetworkTrafficAnnotationTag traffic_annotation,
113*6777b538SAndroid Build Coastguard Worker                         int rv);
114*6777b538SAndroid Build Coastguard Worker   int HandleWriteResult(HttpConnection* connection, int rv);
115*6777b538SAndroid Build Coastguard Worker 
116*6777b538SAndroid Build Coastguard Worker   // Expects the raw data to be stored in recv_data_. If parsing is successful,
117*6777b538SAndroid Build Coastguard Worker   // will remove the data parsed from recv_data_, leaving only the unused
118*6777b538SAndroid Build Coastguard Worker   // recv data. If all data has been consumed successfully, but the headers are
119*6777b538SAndroid Build Coastguard Worker   // not fully parsed, *pos will be set to zero. Returns false if an error is
120*6777b538SAndroid Build Coastguard Worker   // encountered while parsing, true otherwise.
121*6777b538SAndroid Build Coastguard Worker   bool ParseHeaders(const char* data,
122*6777b538SAndroid Build Coastguard Worker                     size_t data_len,
123*6777b538SAndroid Build Coastguard Worker                     HttpServerRequestInfo* info,
124*6777b538SAndroid Build Coastguard Worker                     size_t* pos);
125*6777b538SAndroid Build Coastguard Worker 
126*6777b538SAndroid Build Coastguard Worker   HttpConnection* FindConnection(int connection_id);
127*6777b538SAndroid Build Coastguard Worker 
128*6777b538SAndroid Build Coastguard Worker   // Whether or not Close() has been called during delegate callback processing.
129*6777b538SAndroid Build Coastguard Worker   bool HasClosedConnection(HttpConnection* connection);
130*6777b538SAndroid Build Coastguard Worker 
131*6777b538SAndroid Build Coastguard Worker   const std::unique_ptr<ServerSocket> server_socket_;
132*6777b538SAndroid Build Coastguard Worker   std::unique_ptr<StreamSocket> accepted_socket_;
133*6777b538SAndroid Build Coastguard Worker   const raw_ptr<HttpServer::Delegate> delegate_;
134*6777b538SAndroid Build Coastguard Worker 
135*6777b538SAndroid Build Coastguard Worker   int last_id_ = 0;
136*6777b538SAndroid Build Coastguard Worker   std::map<int, std::unique_ptr<HttpConnection>> id_to_connection_;
137*6777b538SAndroid Build Coastguard Worker 
138*6777b538SAndroid Build Coastguard Worker   base::WeakPtrFactory<HttpServer> weak_ptr_factory_{this};
139*6777b538SAndroid Build Coastguard Worker };
140*6777b538SAndroid Build Coastguard Worker 
141*6777b538SAndroid Build Coastguard Worker }  // namespace net
142*6777b538SAndroid Build Coastguard Worker 
143*6777b538SAndroid Build Coastguard Worker #endif // NET_SERVER_HTTP_SERVER_H_
144