mirror of
https://github.com/klzgrad/naiveproxy.git
synced 2024-11-28 08:16:09 +03:00
101 lines
3.6 KiB
C++
101 lines
3.6 KiB
C++
// 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_
|