• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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