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