#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/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/run_loop.h"
#include "base/sequence_checker.h"
#include "base/task/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::test_server {
class ControllableHttpResponse {
public:
ControllableHttpResponse(EmbeddedTestServer* embedded_test_server,
const std::string& relative_url,
bool relative_url_is_prefix = false);
ControllableHttpResponse(const ControllableHttpResponse&) = delete;
ControllableHttpResponse& operator=(const ControllableHttpResponse&) = delete;
~ControllableHttpResponse();
void WaitForRequest();
void Send(const std::string& bytes);
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 = {},
const std::vector<std::string>& extra_headers = {});
void Done();
const HttpRequest* http_request() const { return http_request_.get(); }
bool has_received_request();
private:
friend class ControllableHttpResponseManager;
enum class State { WAITING_FOR_REQUEST, READY_TO_SEND_DATA, DONE };
ControllableHttpResponse(scoped_refptr<base::SingleThreadTaskRunner>
embedded_test_server_task_runner,
base::WeakPtr<HttpResponseDelegate> delegate,
std::unique_ptr<HttpRequest> http_request);
void OnRequest(std::unique_ptr<HttpRequest> http_request,
scoped_refptr<base::SingleThreadTaskRunner>
embedded_test_server_task_runner,
base::WeakPtr<HttpResponseDelegate> delegate);
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_;
base::WeakPtr<HttpResponseDelegate> delegate_;
std::unique_ptr<HttpRequest> http_request_;
SEQUENCE_CHECKER(sequence_checker_);
base::WeakPtrFactory<ControllableHttpResponse> weak_ptr_factory_{this};
};
class ControllableHttpResponseManager {
public:
ControllableHttpResponseManager(EmbeddedTestServer* embedded_test_server,
const std::string& relative_url,
bool relative_url_is_prefix = false);
ControllableHttpResponseManager(const ControllableHttpResponseManager&) =
delete;
ControllableHttpResponseManager& operator=(
const ControllableHttpResponseManager&) = delete;
~ControllableHttpResponseManager();
std::unique_ptr<ControllableHttpResponse> WaitForRequest();
private:
static std::unique_ptr<HttpResponse> RequestHandler(
base::WeakPtr<ControllableHttpResponseManager> controller,
scoped_refptr<base::SingleThreadTaskRunner> controller_task_runner,
const std::string& relative_url,
bool relative_url_is_prefix,
const HttpRequest& request);
void OnRequest(std::unique_ptr<HttpRequest> http_request,
scoped_refptr<base::SingleThreadTaskRunner>
embedded_test_server_task_runner,
base::WeakPtr<HttpResponseDelegate> delegate);
std::unique_ptr<ControllableHttpResponse> current_response_;
std::unique_ptr<base::RunLoop> loop_;
SEQUENCE_CHECKER(sequence_checker_);
base::WeakPtrFactory<ControllableHttpResponseManager> weak_ptr_factory_{this};
};
}
#endif