1 // Copyright 2021 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef NET_TEST_EMBEDDED_TEST_SERVER_HTTP1_CONNECTION_H_ 6 #define NET_TEST_EMBEDDED_TEST_SERVER_HTTP1_CONNECTION_H_ 7 8 #include <memory> 9 10 #include "base/functional/callback.h" 11 #include "base/functional/callback_forward.h" 12 #include "base/memory/raw_ptr.h" 13 #include "base/memory/scoped_refptr.h" 14 #include "base/memory/weak_ptr.h" 15 #include "net/base/completion_once_callback.h" 16 #include "net/base/io_buffer.h" 17 #include "net/test/embedded_test_server/embedded_test_server_connection_listener.h" 18 #include "net/test/embedded_test_server/http_connection.h" 19 #include "net/test/embedded_test_server/http_request.h" 20 #include "net/test/embedded_test_server/http_response.h" 21 22 namespace net { 23 24 class StreamSocket; 25 26 namespace test_server { 27 28 class EmbeddedTestServer; 29 30 // Wraps the connection socket. Accepts incoming data and sends responses via 31 // HTTP/1.1. 32 // 33 // Should be owned by the EmbeddedTestServer passed to the constructor. 34 // 35 // Lifetime of this connection (and the delegate) is one request/response pair. 36 // Calling FinishResponse will immediately send a signal to the owning 37 // EmbeddedTestServer that the connection can be safely destroyed and the socket 38 // can taken by a connection listener (if it has not already closed and a 39 // listener exists). The connection will also immediately signal the server 40 // to destroy the connection if the socket closes early or returns an error on 41 // read or write. 42 class Http1Connection : public HttpConnection, public HttpResponseDelegate { 43 public: 44 Http1Connection(std::unique_ptr<StreamSocket> socket, 45 EmbeddedTestServerConnectionListener* connection_listener, 46 EmbeddedTestServer* server_delegate); 47 ~Http1Connection() override; 48 Http1Connection(Http1Connection&) = delete; 49 Http1Connection& operator=(Http1Connection&) = delete; 50 51 // HttpConnection 52 void OnSocketReady() override; 53 std::unique_ptr<StreamSocket> TakeSocket() override; 54 StreamSocket* Socket() override; 55 base::WeakPtr<HttpConnection> GetWeakPtr() override; 56 57 // HttpResponseDelegate 58 void AddResponse(std::unique_ptr<HttpResponse> response) override; 59 void SendResponseHeaders(HttpStatusCode status, 60 const std::string& status_reason, 61 const base::StringPairs& headers) override; 62 void SendRawResponseHeaders(const std::string& headers) override; 63 void SendContents(const std::string& contents, 64 base::OnceClosure callback) override; 65 void FinishResponse() override; 66 void SendContentsAndFinish(const std::string& contents) override; 67 void SendHeadersContentAndFinish(HttpStatusCode status, 68 const std::string& status_reason, 69 const base::StringPairs& headers, 70 const std::string& contents) override; 71 72 private: 73 void ReadData(); 74 void OnReadCompleted(int rv); 75 bool HandleReadResult(int rv); 76 void SendInternal(base::OnceClosure callback, 77 scoped_refptr<DrainableIOBuffer> buffer); 78 void OnSendInternalDone(base::OnceClosure callback, 79 scoped_refptr<DrainableIOBuffer> buffer, 80 int rv); 81 82 std::unique_ptr<StreamSocket> socket_; 83 raw_ptr<EmbeddedTestServerConnectionListener, AcrossTasksDanglingUntriaged> 84 connection_listener_; 85 raw_ptr<EmbeddedTestServer> server_delegate_; 86 HttpRequestParser request_parser_; 87 scoped_refptr<IOBufferWithSize> read_buf_; 88 std::vector<std::unique_ptr<HttpResponse>> responses_; 89 90 base::WeakPtrFactory<Http1Connection> weak_factory_{this}; 91 }; 92 93 } // namespace test_server 94 } // namespace net 95 96 #endif // NET_TEST_EMBEDDED_TEST_SERVER_HTTP1_CONNECTION_H_ 97