| // Copyright 2020 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef SYSTEM_PROXY_TEST_HTTP_SERVER_H_ |
| #define SYSTEM_PROXY_TEST_HTTP_SERVER_H_ |
| |
| #include <memory> |
| #include <queue> |
| #include <string> |
| #include <string_view> |
| |
| #include <base/files/scoped_file.h> |
| #include <base/memory/weak_ptr.h> |
| #include <base/threading/simple_thread.h> |
| |
| namespace patchpanel { |
| class Socket; |
| } // namespace patchpanel |
| |
| namespace system_proxy { |
| |
| // HTTP server implementation for testing purpose that runs on a separate |
| // thread. This server allows users to setup expected HTTP server replies and |
| // listen in a blocking mode until all the requests are fulfilled. It does not |
| // perform client request syntax validation. |
| class HttpTestServer : public base::SimpleThread { |
| public: |
| enum class HttpConnectReply { |
| kOk, |
| kAuthRequiredBasic, |
| kAuthRequiredKerberos, |
| kBadGateway |
| }; |
| |
| HttpTestServer(); |
| HttpTestServer(const HttpTestServer&) = delete; |
| HttpTestServer& operator=(const HttpTestServer&) = delete; |
| ~HttpTestServer() override; |
| |
| // Starts the HTTP server which will perform a blocking listen() on the |
| // address returned by |GetUrl| until all the requets set via |
| // |AddHttpConnectReply| are fulfilled. |
| void Run() override; |
| // Sets the expected HTTP responses from the server. Must be called before |
| // starting the thread. |
| void AddHttpConnectReply(HttpConnectReply reply); |
| // Returns the URL as scheme://host:port that points to the server. |
| std::string GetUrl(); |
| |
| private: |
| // Creates the proxy listening socket which is bound to the localhost and a |
| // dynamically allocated port. The proxy address can be retrieved using |
| // |GetUrl|. |
| void BeforeStart() override; |
| |
| void SendConnectReply(); |
| // Returns the HTTP message associate with |reply|. |
| std::string_view GetConnectReplyString(HttpConnectReply reply); |
| |
| uint32_t listening_addr_; |
| int listening_port_; |
| std::queue<HttpConnectReply> expected_responses_; |
| std::unique_ptr<patchpanel::Socket> listening_socket_; |
| base::WeakPtrFactory<HttpTestServer> weak_ptr_factory_{this}; |
| }; |
| } // namespace system_proxy |
| |
| #endif // SYSTEM_PROXY_TEST_HTTP_SERVER_H_ |