| // Copyright 2017 The Chromium 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 NET_TEST_EMBEDDED_TEST_SERVER_CONTROLLABLE_HTTP_RESPONSE_H_ |
| #define NET_TEST_EMBEDDED_TEST_SERVER_CONTROLLABLE_HTTP_RESPONSE_H_ |
| |
| #include <memory> |
| #include <string> |
| #include <vector> |
| |
| #include "base/macros.h" |
| #include "base/memory/ref_counted.h" |
| #include "base/memory/weak_ptr.h" |
| #include "base/run_loop.h" |
| #include "base/sequence_checker.h" |
| #include "base/single_thread_task_runner.h" |
| #include "net/http/http_status_code.h" |
| #include "net/test/embedded_test_server/embedded_test_server.h" |
| #include "net/test/embedded_test_server/http_request.h" |
| #include "net/test/embedded_test_server/http_response.h" |
| |
| namespace net { |
| |
| namespace test_server { |
| |
| // A response that can be manually controlled on the current test thread. It is |
| // used for waiting for a connection, sending data and closing it. It will |
| // handle only **one** request with the matching |relative_url|. In the case of |
| // multiple ControllableHttpResponses for the same path, they're used in the |
| // order they were created. |
| // |
| // If |relative_url_is_prefix| is true, |relative_url| is only compared agaisnt |
| // the start of the URL being requested, which allows matching against (possibly |
| // variable) query strings, for instance. |
| class ControllableHttpResponse { |
| public: |
| ControllableHttpResponse(EmbeddedTestServer* embedded_test_server, |
| const std::string& relative_url, |
| bool relative_url_is_prefix = false); |
| ~ControllableHttpResponse(); |
| |
| // These method are intented to be used in order. |
| // 1) Wait for the response to be requested. |
| void WaitForRequest(); |
| |
| // 2) Send raw response data in response to a request. |
| // May be called several time. |
| void Send(const std::string& bytes); |
| |
| // Same as 2) but with more specific parameters. |
| void Send(net::HttpStatusCode http_status, |
| const std::string& content_type = std::string("text/html"), |
| const std::string& content = std::string(), |
| const std::vector<std::string>& cookies = {}); |
| |
| // 3) Notify there are no more data to be sent and close the socket. |
| void Done(); |
| |
| // Returns the HttpRequest after a call to WaitForRequest. |
| const HttpRequest* http_request() const { return http_request_.get(); } |
| |
| private: |
| class Interceptor; |
| |
| enum class State { WAITING_FOR_REQUEST, READY_TO_SEND_DATA, DONE }; |
| |
| void OnRequest(scoped_refptr<base::SingleThreadTaskRunner> |
| embedded_test_server_task_runner, |
| const SendBytesCallback& send, |
| const SendCompleteCallback& done, |
| std::unique_ptr<HttpRequest> http_request); |
| |
| static std::unique_ptr<HttpResponse> RequestHandler( |
| base::WeakPtr<ControllableHttpResponse> controller, |
| scoped_refptr<base::SingleThreadTaskRunner> controller_task_runner, |
| bool* available, |
| const std::string& relative_url, |
| bool relative_url_is_prefix, |
| const HttpRequest& request); |
| |
| State state_ = State::WAITING_FOR_REQUEST; |
| base::RunLoop loop_; |
| scoped_refptr<base::SingleThreadTaskRunner> embedded_test_server_task_runner_; |
| SendBytesCallback send_; |
| SendCompleteCallback done_; |
| std::unique_ptr<HttpRequest> http_request_; |
| |
| SEQUENCE_CHECKER(sequence_checker_); |
| |
| base::WeakPtrFactory<ControllableHttpResponse> weak_ptr_factory_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ControllableHttpResponse); |
| }; |
| |
| } // namespace test_server |
| |
| } // namespace net |
| |
| #endif // NET_TEST_EMBEDDED_TEST_SERVER_CONTROLLABLE_HTTP_RESPONSE_H_ |