// 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 #include #include #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& 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 embedded_test_server_task_runner, const SendBytesCallback& send, const SendCompleteCallback& done, std::unique_ptr http_request); static std::unique_ptr RequestHandler( base::WeakPtr controller, scoped_refptr 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 embedded_test_server_task_runner_; SendBytesCallback send_; SendCompleteCallback done_; std::unique_ptr http_request_; SEQUENCE_CHECKER(sequence_checker_); base::WeakPtrFactory weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(ControllableHttpResponse); }; } // namespace test_server } // namespace net #endif // NET_TEST_EMBEDDED_TEST_SERVER_CONTROLLABLE_HTTP_RESPONSE_H_